QWorker可以做什么?

1、可以完成需要定时执行的作业,相当于一个多线程的定时器,如果运行在主线程,则它可以完全替代TTimer。 2、可以完成延迟执行操作,不再依靠Sleep,你可以将计划更明确的分步骤延迟完成,写的代码更好看,更精炼。 3、可以按信号触发某些操作,程序就不需要去轮询某些状态。而且通过信号触发,响应者可以有多个,而不是有一个

Delphi下的脚本引擎

Delphi下有许多优秀的解释引擎,语法涵盖了Pascal、C、JavaScript和Basic等等。下面列举下我知道的脚本引擎,有商业和开源的版本: PaxCompiler/PaxScript 商业,提供源码 FastScript 商业,提供源码 DWScript 开源,MPL协议 QExp 开源,我写的,但暂时放弃

多线程排序-QWorker版本实现

当前处理器多核心已经成为标配,无论是手机还是PC,充分利用多核心处理资源,是程序员的职责所在。本次展示的例子,利用QWorker提供的多线程作业管理,演示了如何实现多线程排序。 要进行多线程排序,首先确定数据量是否足够大,太小的数据可能都不够线程创建和切换的开销,那就不如在单一线程中执行效率更高,毕竟线程创建和释放都会

PostgreSQL的date_part/extract函数

PostgreSQL可以使用datepart/Extract从日期时间类型中抽取部分内容,帮助内容如下: EXTRACT(fieldFROMsource) extract函数从日期/时间数值里抽取子域,比如年、小时等。 source必须是一个 typetimestamp,time,interval类型的值 表达式(类型

从数据库里随机选择一行

说起来觉得很复杂,实际上很简单,对于有主键的数据库,如果值是整数,则那随便生成一个随机数,是最大值和最小值之间的一个值,然后取大于随机数的一个第记录就可以。如果没有别的方式,可以按随机数排序,如下: select top 1 * from 表名 order by random() 或 select * from 表名

PostgreSQL-计算指定时间所在周的开始与结束日期

    有时候,我们知道一周的某一天,但需要这周起始是那一天,结束是那一天。在PostgreSQL及绝大多数语言中,都没有提供这么一个函数,也许是用的人少吧,毕竟一般的统计报表都是日报、月报、季报或年报,周报相对较少。     我写了两个计算指定日期所在周的开始和结束日期的函数,分享给大家。     1、WeekSta

PostgreSQL中错误返回的信息内容

    PostgreSQL在客户端出错时,服务器端返回了丰富的错误信息,当然最终返回到上层的只是一部分。参考Pg的文档,出现在 ErrorResponse 和 NoticeResponse 消息里由多个字段构成。 每个字段类型有一个单字节标识记号。请注意,任意给定的字段类型在每条消息里都应该最多出现一次。 S 严重性

PostgreSQL MD5 加密验证算法分析

    因为QDAC 3.0里,PostgreSQL不打算继续带一大堆动态链接库,所以驱动打算直接写。开源的好处就是可以拿到源码来分析,然后写出自己的实现。     我们首先来看PostgreSQL的登录过程(非SSL方式):     1、发送初始化数据包,告诉服务器我们是谁,要连那个数据库及一些额外的参数。    

Delphi早期版本WideString的替代解决方案

    在Delphi的早期版本中,并没有提供UnicodeString,而WideString缓慢的性能使许多使用宽字符串的应用性能不高。本文提供了一种方法,来优化早期的宽字符串速度。     【注意】本文并没有完整实现所有需要的方法,如果您有兴趣,自己实现剩下的部分吧。     我们知道WideString速度慢的

QWorker与XE 7的System.Threading对比

   Delphi/C++ Builder XE7版新引入了System.Threading单元来加入并行编程支持,而QWorker却是从作业(Job)的视角,面向作业和工作者(Worker)提供编程支持,同时QWorker也同时提供了TQForJobs来支持For并行编程支持。     在QWorker里,我们将要处

QWorker中匿名作业函数访问局部变量的限制

QWorker的每个工作者(Worker)都是一个线程,即使作业被约束为在主线程中执行,作业也是异步完成了,这意味着,当函数执行结束时,由于栈被还原,栈上的变量便不再有效,如果访问其内容,可能会破坏栈上的数据,所以不应访问栈上的数据。 那么,如果想要访问栈上的变量,那就必需保证栈的正确性,而保证这一点,就要求在作业执行

QWorker技巧之中止作业

QWorker作业属于协同多任务处理的模型,也就是说作业过程未完成之前,外部无法将其中止。QWorker的TQJob结构提供了一个IsTerminated属性来判断作业是否该中止,但这种中止必需要作业过程自己检测处理。这样做的主要原因,是避免由于强制中止工作者造成内存泄露等不必要的麻烦。 QWorker待处理的作业,可

QWorker技巧之随机间隔作业

正常的重复作业之间的时间间隔一旦确定下来,但不会再变化,理论上它只受系统资源的限制(如没有足够的处理器资源,造成作业无法被处理)。 但如果在特殊环境下,我们要完成一个不规则的定时器,则可以使用Delay函数来规则一个延迟作业,然后在延迟的作业中,再次Delay自身,这样子循环往复,形成一个不规则的定时器。只要每次Del

QWorker技巧之作业与主线程之间通讯

作业一般在后台线程中进行,但当其需要和主线程交互时,有多种方法可以完成,这里列出常见的3种: 1、直接使用一个在主线程执行的新的作业,然后将参数做为Data传递到新的作业中。至于参数Data的内容,则不在讨论之列。但这种方式不会等待新投寄的作业完成(实际上绝大多数情况下我们应尽量避免长时间占用工作者资源,为其它工作者留

QAES-AES加密支持单元

AES加密Delphi有很多实现,QAES也是抄自先烈们的实现,进行了二次封装,但将接口进一步简单化,让其更易用。 TQAES = record private FKey: QStringW; FMode: TQAESEncryptMode; FKeyType: TQAESKeyType; FInitVector: T

另类Delphi关键字-absolute

在Delphi中,absolute用于代表指定的变量是另一个变量另一种声明格式。比如: TInt32Value=record     IntValue:Integer;   end; TByteValue=record     ByteValue:array[0..3] of Byte;   end; 现在声明一个TI

QWorker – Delphi编写的基于作业的跨平台多线程作业管理器

QWorker 3.0 – Delphi编写的基于作业的多线程作业管理器,线程池、队列、计划任务总有你所需要的,充分利用现代处理器的多线程处理能力。 它包括: 1、自维护的线程池; 2、普通的后台线程作业; 3、支持精度高达0.1ms的定时重复作业; 4、支持计划任务作业; 5、支持延迟执行作业; 6、信号

QWorker技巧之参数化

QWorker本身只提供了一个附加的Data成员来让用户传递额外的数据,而Data是一个Pointer,这就决定了它可以允许用户随意控制传入的内容。但就象所有的异步过程一样,传入的内存块如果是从堆中临时申请的,那么它就存在一个释放的问题,谁来负责释放,怎么去释放? QWorker想到了这一个问题,提供了一个不错的解决方