今天音儿在测试时,发现FBusyCount计数不正确,目前正在查找原因并修改。受此问题影响,可能会对并发性能造成一定的降低。
月度归档: 2014 年 8 月
QWorker自定义作业数据指针释放方法
QWorker今天的更新加入jdfFreeAsC1~C6是为了应对C++中丰富的内存分配和管理方式,提供了6种自定的的处理方式供用户选择。当然Delphi你要自己去管理一些东西,也一样可以用,比如将Data指向一个池中的对象,然后在释放时返回到池中。下面的例子写的是针对C++的,如new/delete,new[]/de
QWorker信号作业处理详解
QWorker的信号作业是一个可以说是很好玩的特色功能,它可以让你做出很好的松散耦合的程序,而松散耦合是软件设计过程中,被人推崇的一种设计模式。 为什么说QWorker的信号作业是松散耦合的呢?因为它具体以下特点: 1、信号的触发者根本就不知道有没有关注这个信号,它的任务就是触发这个信号而已; 2、信号的响应者根本就不
线程正确的退出等待方式
一个线程如果退出时,我们习惯写下如下代码: AThread.Terminate; … AThread.WaitFor; AThread.Free; 但在DLL中调用会在WaitFor的地方出现死等的现象,线程无法退出。 改为下面的代码可以解决: AThread.Suspended:=False;//线程如果没运行强
如何使用QWorker控制工作流
要想使用QWorker控制工作流,实际上很容易。 首先,我们将工作流中的每个结点做为一个作业来考虑。 其次,作业之间的工作流控制,我们通过信号类作业来完成。 在作业完成后,触发一个信号,而在这个信号的响应函数中,去处理前置条件的检查,如果符合条件,就启动响应作业处理逻辑,否则,忽略,也就实现了工作流的控制。
判断当前操作系统是否是64位操作系统
实际上就是通过判断64位操作系统上特有的函数来解决就可以,当然前提你的程序是32位的,64位的程序判断是没有必要的,因为32位上跑不起来。下面的代码抄自盒子上 的论坛帖子wang_80919 (Flying Wang)的回复: function IsWOW64: BOOL; begin Result := False;
QWorker-不仅仅是一个线程池
首先,我们承认QWorker是一个线程池,毕竟它的每个工作者一就是一个线程。 其次,QWorker不仅仅是一个线程池,这意味着它做的工作远远超过线程池的管理,而且牵涉到完整的作业调度。QWorker基于作业的视角,让其功能变得与众不同。 从作业的视角来看,我们模拟一个场景: 1、你安排你
QWorker成功运行于Andriod手机上了!
同样的代码只要重新编译,就可以完美的跑到OSX和iOS上。
Delphi实现的Sunday字符串搜索算法
type TBMKey=record Length:Integer; Offsets:array[0..255] of Integer; ps:PAnsiChar; end; procedure InitKeyDistance(var AKey:TBMKey); var I:Integer; begin AKey.Le
【转】封三郎-Delphi用QJSON解析JSON格式的数据
原始链接:http://www.cnblogs.com/codingnote/p/3821025.html 本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理。 这是一个国内高手写开源免费的东西,赞一个。 假入数据如下: {“message”:”ok”,”sta
QWorker中分组作业的控制(TQJobGroup)
QWorker推出已经有一段时间了,现在我们来聊一下QWorker的作业分组。 在前面我们已经对QWorker的作业类型做了一个比较全面的描述(参见:QWorker的作业类型详解),大家可以发现,我们缺少一种机制,在投寄完多个作业后,能够知道它们都完成了,这种工作就交给了TQJobGroup。 TQJobGroup允许
QWorker的作业类型详解
QWorker最近很受群友的关注,因此单独将其中的作业类型详细拿出来说明下。 QWorker的按照不同的标准,可将作业类型分为不同的类型: 1、按触发方式分 按照触发方式可以分为手工投寄、定时重复和信号触发三种方式。顾名思义,手工投寄作业用户投寄一次就只运行一次,如果需要,就由用户手工重复投寄。
PostgreSQL函数-取指定月份的起始与截止日期
取月份的起始日期很容易: date_trunc(‘month’,该月中的某一天) 取月份中的结束日期(实际上是下个月的1号0点) date_trunc(‘month’,该月中的某一天)+’1month’::interval 如果不想取下个月1号的0点,就再减去1天就好了。 date_trunc(‘month’,该月中的
在Delphi中基于内容检测图片格式(非扩展名)
type TGraphicFormat=(gfUnknown,gfBitmap,gfJpeg,gfPng,gfGif,gfMetafile,gfTga,gfPcx,gfTiff,gfIcon,gfCursor,gfIff,gfAni); ///<summary>检测图片格式</summary>
经验谈:分析问题时避免陷入细节陷阱
我们周围的每个人都是不同的,每件事都有其特别之处,但在我们分析和解决问题时,只突出差异,忽略其共性,往往会造成问题越分析越复杂,最后就如同线团一样,将自己绕在中间,迷糊之间自己已经晕头转向,问题也就往往无解了。 而实际上,分析问题的方法有很多种,有自上向下的瀑布法则,也有自下向上的统计法则,当年在陷入具
QWorker技巧之如何向等待信号处理作业传递参数
QWorker支持信号类型的作业,你可以通过触发某个信号,来让监听此信号的作业处理代码进行某些处理。关于这方面的详细说明,参考文章:QWorker信号作业处理详解。 由于信号作业需要分为信号注册和触发两个阶段,那么要传递参数时机是什么时候呢?QWorker约定是在触发信号的Singal函数中,提供一个无类型指针ADat
QWorker与现实的原理映射
QWorker基于作业管理,整个管理体系实际与现实中形成很强的对应关系: 1、TQJob相当于用户交付的任务,TQWorker对应于工人,TQWorkers对应于包工头; 2、包工头,雇了两个长工,剩下的工人都是打短工的; 3、用户将任务(作业)交给包工头,并告诉他要求,包工头看长工是否有空,有则长工就直接处理了,如果
QScript将来可能用到的东西笔记
如果一个函数的返回值是固定的,那么我们可以将多次重复调用合并为一次,然后用一个常量代替。 这是编译器的一个常规优化技巧,做脚本解释器的话,也应该考虑到,以便提高运行效率。
PostgreSQL函数-取指定日期所隶属季度的起始日期
一句代码,ADate为指定的日期,AQuarterStart为返回的季度起始日期 AQuarterStart=date_trunc(‘quarter’,ADate);
QWorker不要在主窗体OnDestroy里投寄异步作业
原因很简单: 1、投寄的作业可能根本不会执行到,所以没有意义; 2、作业如果不幸投寄到主线程去执行,那么,执行时,主窗体可能已经被释放,如果你的作业访问了相应的内容,那么,好一点是什么不会发生,不好的话,说不定会发生什么神奇的事情。 另外补充提醒下: 不要在Destroy里投寄与自己相关的作业,当执行时,都死透透了,问