qdac吧
关注: 78 贴子: 239

QDAC开源组件官方讨论交流吧

  • 目录:
  • 程序设计及人工智能
  • 3
    xe6怎么都装不上,求一个安装方法。安装完后就是这样的,里面的插件都没有
    mofees 10-9
  • 0
    请问qdac_fmx_vkhelper在delphi 10.2.3 设置安卓透明状态栏下失效。也就是虚拟键盘照样遮挡输入控件。有什么解决办法吗?
  • 1
    原因很简单: 1、投寄的作业可能根本不会执行到,所以没有意义; 2、作业如果不幸投寄到主线程去执行,那么,执行时,主窗体可能已经被释放,如果你的作业访问了相应的内容,那么,好一点是什么不会发生,不好的话,说不定会发生什么神奇的事情。 另外补充提醒下: 不要在Destroy里投寄与自己相关的作业,当执行时,都死透透了,问题不是100%发生,但肯定会有。
    anfu0310 11-28
  • 2
    QWorker提供了一组作业管理函数,要实现定时执行一项任务,QWorker可以使用如下代码简单实现: 1、首先定义一个定时回调函数,假设它隶属于TForm1 procedure TForm1.DoTimerJob(AJob:PQJob); begin Label1.Caption:=FormatDateTime('yyyy-mm-dd hh:nn:ss',Now); end; 2、投寄一个定时器作业,注意由于定时器作业我访问了窗体的VCL成员,所以需要在主线程中调用: Workers.Post(DoTimerJob,Q1Second,nil,True); 至此,定时器作业就已经完成了。
  • 1
    链接:hi.baidu.com/yangyxd/item/54fffba7daefa1f415329b99   QWorker来自于QDAC项目,是QDAC作者swish创作的一件神器,它是专门用来进行作业管理的轻量级类库。说是轻量级,只是从代码结构上来讲,功能可一点也不弱。QWorker的用法很简单,swish也写了相关的博文,不会用的同学可以自己找来浏览即可。   QWorker可以提供了清除正在执行和未执行Job(作业)的功能,以及JobGroup超时机制。那么,它是怎么实现Clear与Timeout的呢?今天我想说的正是这个。   在TQWorker
    服了637 12-24
  • 44
    2014.6.21 ========= * 加入了对COM的支持,如果需要在作业中使用COM对象,调用Job.Worker.ComNeeded后即可正常访问各个COM对象 2014.6.19 ========= * 修正了DoMainThreadWork函数的参数传递顺序错误 * 为TQWorker加入了ComNeeded函数,以支持COM的初始化,保障作业内COM相关函数调用 2014.6.17 ========= * 信号触发作业时,加入附加数据成员参数,它将被附加到TQJob结构的Data成员,以便 上层应用能够做必要的标记,默认值为空 * 作业投寄时加入了附加的参数,决定如何释放附加的数
  • 22
    2014.6.21 ========== * 移除原来AddObject/AddRecord/ToObject/ToRecord支持 + 添加FromRtti/ToRtti/FromRecord/ToRecord/ToRttiValue函数支持,替换原来的RTTI函数 + 添加Invoke函数,支持直接通过Json调用对应的函数,具体参考Demo 2014.6.17 ========= * AsFloat赋值时加入对Nan、Infinite、NegInfinite三个无效值的检查 * AsVariant赋值时加入对varNull,varEmpty,varUnknown,varUInt64类型的支持 2014.5.27 ========== + TQHashedJson 支持,这是一个面向查询优化的版本,使用哈希表加快ItemByName的查询速度, 如果您的应用
  • 18
    2014.6.21 ========== + 增加RTTI函数支持(Invoke/FromRtti/ToRtti/FromRecord/ToRecord) 2014.6.20 ========== + 增加对Single类型的支持(AsSingle),这样全部MessagePack格式的支持完整了 2014.6.19 ========== * 修正了QMsgPack解码时,对于长度为0的字符串解码出错的问题 2014.6.17 ========== * 首个正式版本发布,目前与RTTI相关的几个函数暂时不可用
    chineseswish 11-21
  • 3
    2014-6-21 ======== * 修订了在Delphi 2010下编译由于TThreadId类型未定义而造成的无法编译的问题
    chineseswish 11-11
  • 0
    QJson和QMsgPack提供了对RTTI的支持,让你可以简洁方便的完成数据的转换存贮。因为QJson和QMsgPack在RTTI接口上是一致的,因此本文以QJson为例予以说明,如果要换成QMsgPack,只需要将类型声明换下就好:)。 1、记录类型 我们提供了FromRecord/ToRecord两个函数来完成记录类型的读写操作。FromRecord将一个记录类型的内容转储到QJson或QMsgPack中,ToRecord是从QJson或QMsgPack中恢复记录的内容。 下面是一个FromRecord的简单例子: type TMyRecord=record Name:String; Age:Integer; end; ... var A
    chineseswish 11-10
  • 2
    AES加密Delphi有很多实现,QAES也是抄自先烈们的实现,进行了二次封装,这样子将接口简单化。 TQAES = record private FKey: QStringW; FMode: TQAESEncryptMode; FKeyType: TQAESKeyType; FInitVector: TQAESBuffer; public function AsECB(const AKey: QStringW; AKeyType: TQAESKeyType = kt256):PQAES; overload; function AsCBC(const AInitVector: TQAESBuffer; const AKey: QStringW; AKeyType: TQAESKeyType = kt256):PQAES; overload; procedure Encrypt(ASource, ADest: TStream); overload; procedure Encrypt(const p: Pointer; len: Integer; var AResult: TBytes); overload; procedure Encr
  • 10
    2014.5.14 ========= + 加入CopyIf/DeleteIf/FindIf函数 + 加入for..in语法支持 2014.5.6 ======== + 加入ParseBlock函数支持 2014.5.1 ======== + 加入AddRecord函数,支持直接保存记录数据,但以下类型的成员会被忽略 对象(Class)、函数(Method)、接口(Interface)、类型引用(ClassRef),指针(Pointer)、过程(Procedure) 将来可能根据实际需要决定是否添加支持 + 加入ToRecord函数,完成Json直接到记录类型的转换 + 加入Copy函数用于创建当前结点的一个拷贝实例,注意目前版本克隆内部调用了Copy函数,
    chineseswish 10-31
  • 1
    官网专题地址:http://www.qdac.cc/?p=191 专题内容: QWorker中QDAC组件库中的一个重要组成部分,目标是降低在Delphi和C++Builder多线程编程的复杂度。QWorker首先是从作业的角度来规划多线程编程,通过将要完成的目标任务分解成一个个作业,从而达到简化编程模型,提高系统运行效率的目的。 【概念入门】 QWorker – Delphi编写的基于作业的跨平台多线程作业管理器 QWorker与现实的原理映射 QWorker的作业类型详解 QWorker可以做什么? QWorker-不仅仅是一个线程池 QWork
    chineseswish 10-11
  • 0
    本文最早发表于QDAC官方网站:(http://www.qdac.cc/?p=229) 多线程程序的调试对于程序员来说,是心中永远的痛,调试起来痛苦程序不亚于孕妇难产。本篇文章试图将我自己的一些小经验与大家分享,希望对大家会有所帮助。 首先多线程程序编写时,你要注意一条编码规则:永远不要假设代码的执行是连续的。也就是说执行完上一句代码,如果你认为计算机肯定会执行下一句代码的观点是危险的。因为无论Windows还是Linux,都不是早期的协同式多任务模式了,
  • 0
    QWorker的信号作业是一个可以说是很好玩的特色功能,它可以让你做出很好的松散耦合的程序,而松散耦合是软件设计过程中,被人推崇的一种设计模式。 为什么说QWorker的信号作业是松散耦合的呢?因为它具体以下特点: 1、信号的触发者根本就不知道有没有关注这个信号,它的任务就是触发这个信号而已; 2、信号的响应者根本就不知道这个信号是不是会一定触发,它的任务就是万一发生了这个信号,就要做出相应的动作; 3、信号触发者和响应者彼
  • 0
    首先,我们承认QWorker是一个线程池,毕竟它的每个工作者一就是一个线程。 其次,QWorker不仅仅是一个线程池,这意味着它做的工作远远超过线程池的管理,而且牵涉到完整的作业调度。QWorker基于作业的视角,让其功能变得与众不同。 从作业的视角来看,我们模拟一个场景: 1、你安排你家孩子立刻去买瓶酱油,这实际上就是你安排了一项立即在后台执行的作业,在QWorker中用Post方法实现。 2、你告诉你家孩子买完酱油打电话通知你一声,这实际上就
  • 0
    测试环境:华为荣耀2(U9508) 同样的代码只要重新编译,就可以完美的跑到OSX和iOS上。
  • 0
    QWorker支持信号类型的作业,你可以通过触发某个信号,来让监听此信号的作业处理代码进行某些处理。如果需要传递额外的参数,在Singal函数中,将Data成员指向你附加的作业参数即可。注意一点,信号作业的作业处理过程可能有多个,而且是异步执行的,因此,如果传递的是对象或结构体,一定要注意其访问范围及内存释放问题。具体的例子我就不写了,和普通的作业实际上是一样的,如果要系统自动释放的话,设置AFreeType为正确的类型即可。 ------
  • 0
    QWorker基于作业管理,整个管理体系实际与现实中形成很强的对应关系: 1、TQJob相当于用户交付的任务,TQWorker对应于工人,TQWorkers对应于包工头; 2、包工头,雇了两个长工,剩下的工人都是打短工的; 3、用户将任务(作业)交给包工头,并告诉他要求,包工头看长工是否有空,有则长工就直接处理了,如果没空,就雇佣新的短工,交任务交给它做。 4、短工做完工作后,会被继续雇佣一小段时间(15秒),以应付接下来可能的还有更多的工作。如果
  • 20
    说是十万个为什么,实际上没那么多,只是一个自问自答的主题贴,告诉大家什么是QDAC及与QDAC相关的各项内容。
  • 0
    当前处理器多核心已经成为标配,无论是手机还是PC,充分利用多核心处理资源,是程序员的职责所在。本次展示的例子,利用QWorker提供的多线程作业管理,演示了如何实现多线程排序。 要进行多线程排序,首先确定数据量是否足够大,太小的数据可能都不够线程创建和切换的开销,那就不如在单一线程中执行效率更高,毕竟线程创建和释放都会引起额外的开销。 接下来,由于是多线程排序,就牵涉到资源的争用问题。如果使用临界等锁定手段,虽
  • 0
    QDigest是QDAC中MD5和哈希摘要算法的跨平台实现单元,支持MD5、SHA 160、256、384、512。
  • 0
    记住一点,除非你等待作业结束,否则QWorker所有的作业过程都是异步执行的,这意味着,当函数执行结束时,由于栈被还原,栈上的变量便不再有效,如果访问其内容,可能会破坏栈上的数据,所以不应访问栈上的数据。 一个例外是用TQJobGroup来执行作业并等待完成,由于此时栈没被破坏,访问其中的数据可以认为是安全的。
  • 2
    7月6号,群友恢弘报告了一个System.Classes.TBytesStream的一个问题,即其Bytes属性返回的值长度与实际内容的长度不一致,测试确实如此,通过查看源码,可以确认Bytes在内部是8K对齐的,所以使用时,注意其实际大小为Stream.Size,而不是Length(Bytes)。
  • 0
    QWorker增加对COM初始化的支持,如果作业过程中需要调用COM相关的资源,请先执行 [Delphi] AJob.Worker.ComNeeded; [C++] AJob->Worker->ComNeeded(); 然后再执行COM相关的调用就可以了,不需要手动调用CoInitialize/CoInitializeEx/CoUninitialize,如果你手动调用了,就一定要保证其配对。 【注意】这个函数只支持Windows平台,非Windows平台调用没有任何作用,但也不抛出任何异常(实际上是空函数)。一旦初始化一次,线程只要没退出,就不会再次初始化。
  • 0
    type TBMKey=record Length:Integer; Offsets:array[0..255] of Integer; ps:PAnsiChar; end; procedure InitKeyDistance(var AKey:TBMKey); var I:Integer; begin AKey.Length:=StrLen(AKey.ps); for I := 0 to 255 do AKey.Offsets[I]:=AKey.Length; for I := 0 to AKey.Length-1 do AKey.Offsets[Ord(AKey.ps[I])]:=AKey.Length-I-1; end; function SundayStrStrA(s:PAnsiChar;const Key:TBMKey):PAnsiChar; var i,pos,ls:Integer; begin if s=nil then Result:=nil else if Key.ps=nil then Result:=s else begin ls:=StrLen(s); Result:=nil; pos:=1; while pos<=ls-Key.Length do begin I:=pos-1; while I-pos+1<Key.Length do begin
  • 0
    QJson.Encode是用于将当前JSON对象的内容格式化为字符串的函数,AsString/toString/AsJson函数实际低层都调用了它,而在网络传输时,我们实际上并不需要换行等空白字符,此时,手动调用Encode时将第一个ADoFormat参数设置为False。另外,部分控件或软件可能要求中文等特殊字符必需编码,此时,调用Encode函数时将第二个ADoEscape参数设置为True即可(默认False)。 首先看下函数的帮助: /// <summary>编码为字符串</summary> /// <param name="ADoFormat">是否
  • 1
    var AMsgPack:TQMsgPack; V:OleVariant; begin AMsgPack:=TQMsgPack.Create; try ClientDataSet1.CreateDataSet; ClientDataSet1.Append; ClientDataSet1.FieldByName(*Id*).AsInteger:=10; ClientDataSet1.FieldByName(*Name*).AsString:=*Hello*; ClientDataSet1.Post; V:=VarArrayCreate([0,2],varVariant); V[0]:=Now; V[1]:=True; V[2]:=ClientDataSet1.Data; AMsgPack.Add(*Data*).AsVariant:=V; mmResult.Lines.Add(AMsgPack.AsString); ClientDataSet1.Close; ClientDataSet1.Data:=AMsgPack.ItemByName(*Data*).AsVariant[2]; finally AMsgPack.Free; end;
  • 0
    第一、要知道静态数组类型的PTypeInfo的类型信息,可以通过TypeInfo(数组类型)来获取到。 第二、知道上述类型后,可以通过GetTypeData函数来获取到数组元素的类型信息,通过ArrayData.ElCount就是数组的元素个数, 通过PTypeData.ArrayData.ElType取元素的类型。如果RTTI信息不存在,则不需要继续了,你的代码没有相应类型的RTTI信息,你尝试单独将静态数组的类型拿出来定义看看。 第三、知道了子元素的类型后,其TypeData的ElSize就是单个数组元素的大小占用空间大
  • 3
    内存分配情况统计单元 QMemStatics提供了一种途径,来对系统的内存分配情况进行简单的统计分配跟踪,以方便 程序通过合适的手段,减少内存碎片的产生。 QMemStatics提供了一个最简单的减少内存碎片的办法,就是增加内存分配的粒度,通过启 用条件编译RESIZESMALLBLOCK,就可以做到只调整最小内存分配尺寸为ResizeMaxBlockSize, 减少绝大多数内存碎片的生产(默认是64B)。 条件编译选项 RESIZEONLY 可以让模块不为每块内存添加用于识别的头部标志,但同时,也
  • 0
    在Windows平台下,QLog默认在当前程序目录下创建与应用程序同名的日志文件。如果我们想将日志挪到另一个目录,那么我们有以下几个解决方案: 1、直接修改QLog源码,修改默认日志的创建目录。 找到TQLogFileWriter的默认构造函数,修改其FFileName为目标路径下的文件名即可。 constructor TQLogFileWriter.Create; 2、手动创建日志写入器代替默认的日志写入器 (1)、首先,将宏注释掉,避免系统创建默认的写入器 {$DEFINE QLOG_CREATE_DEFAULT_WRITER} (2)、在开始记录日志之前
  • 3
    QString是QDAC提供的一个字符串及相关工具函数单元,本来没有独立说明,其被各个模块上层模块所使用,所以特些单独声明下,以便大家及时更新。
  • 2
    YXDJSON基于swish的QJSON修改,感谢swish,感谢QJson QJson来自QDAC项目,版权归swish(QQ:109867294) 所有感谢网友的支持:恢弘、猫叔 QDAC官方群:250530692 ================== 以上摘自音儿的YxdJson的头部声明。 YxdJson是音儿小白在QJson的基础上设计修改的,它使用Java的fastjson接口形式,对于习惯于Java接口的朋友更方便一些。与QJson相比,它的主要改进在于: √ 针对Delphi 2007上做了优化,使Delphi 2007下拥有了更快的速度; √ 将QString中相关的函数迁移到了YxdJson单元,减少
    yangyxd 7-16
  • 4
    正确、稳定、速度是QDAC项目的追求的三个层次,不正确无法用,不稳定用不好,无速度用不爽,这个帖子的目的就是做各种对比,让速度Hi起来。 So~~~~~ 10 9 8 7 6 5 4 3 2 1 Go
    ymofen 7-14
  • 0
    [概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定。这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来做逻辑处理进程,进一步使得逻辑处理进程更加方便和高效。今天特意写篇blog来记录我的心得与大家分享。 [功能实现说明] 沿用上次的草图 目前DEMO图上的功能都已经实现。下面谈谈各部分的实现。 通信服务,
    ymofen 7-5

  • 发贴红色标题
  • 显示红名
  • 签到六倍经验

赠送补签卡1张,获得[经验书购买权]

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!

本吧信息 查看详情>>

会员: 会员

目录: 程序设计及人工智能