多线程编程, 这三个方法够我用了.
摘要:有一段多线程的程序需要完善, 捋了一遍 XE4 中关于多线程的源码, 发现有这三个类方法就足够我用了, 暂时结束学习.TThread.CreateAnonymousThread(); //普通TThread.Queue(); //队列TThread.Synchronize(); //VCL 同步
阅读全文
posted @
2013-06-11 11:40
万一
阅读(16263)
推荐(0) 编辑
现在, Delphi 的多线程已经非常易用了!
摘要:先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体):{自定义方法: 在窗体上绘制...}procedure MyMethod;var i: Integer;begin for i := 0 to 500000 do begin Form1.Canvas.Lock; Form1.Canvas.TextOut(10, 10, IntToStr(i)); Form1.Canvas.Unlock; end;end;{调用上面的自定义方法}procedure TForm1.Button1Click(Sender: TObject);begin MyMethod;end;修改为多线程(只
阅读全文
posted @
2011-05-18 13:27
万一
阅读(76874)
推荐(4) 编辑
多线程编程(20) - 展望与阶段性总结
摘要:多线程学习才刚刚入门, 已经学习了线程的建立与同步; 种种原因要先停一停, 还要继续学习的东西有: 更多等待函数 互锁函数 多线程的优先级 线程的亲缘性 线程下的纤程 线程池 多进程编程及作业对象 当然还有 Delphi 提供的 TThread 等方便实用的类.
阅读全文
posted @
2009-02-22 21:39
万一
阅读(9718)
推荐(0) 编辑
多线程编程(19) - 不使用同步工具, 手动协调线程依次执行
摘要:在前面例子的基础上, 探讨新问题. 假如我们想让几个线程(例子中是 3 个)依次执行, 我们可以使用临界区、信号、互斥等手段; 但下面第一个例子什么同步工具都没用, 也达到了目的; 方法是: 让前一个线程在结束前顺便启动下一个线程. 第二个例子使用了互斥对象配合 WaitForSingleObject 函数, 也达到相似的目的. 效果图(两个例子的效果图差不多, 但第二个例子的执行顺序不好...
阅读全文
posted @
2009-02-19 23:46
万一
阅读(9428)
推荐(0) 编辑
多线程编程(18) - 再从一个小例子出发
摘要:前面的例子都是让若干线程做同样的事情, 下面这个例子中的三个线程将分别在三个画板上随机画不同颜色的椭圆. 接下来的很多事情我想要基于这个例子来做. 本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, D...
阅读全文
posted @
2009-02-19 21:17
万一
阅读(12689)
推荐(0) 编辑
非官方的 TWaitableTimer 类
摘要:unit WTimer;interfaceuses Windows, SysUtils, SyncObjs;type TWaitableTimer = class(TSynchroObject) protected FHandle: THandle; FPeriod: LongInt; FDueTime: TDateTime; FLastError: Integer; FLongTime: ...
阅读全文
posted @
2009-02-19 15:27
万一
阅读(4789)
推荐(0) 编辑
多线程编程(17) - 多线程同步之 WaitableTimer (等待定时器对象)[续三]
摘要:根据 WaitableTimer 的主要功用, 现在再把它放在 "线程同步" 的话题中讨论有点不合适了, 就要结束它. //重新看看那个 APC 回调函数的格式: procedure TimerAPCProc( lpArgToCompletionRoutine: Pointer; dwTimerLowValue, dwTimerHighValue: DWORD ); stdcall;...
阅读全文
posted @
2009-02-19 12:19
万一
阅读(6344)
推荐(0) 编辑
多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)[续二]
摘要:喝酒醉了一天, 重装系统一天, 两天没上博客了; 继续学习... 想过没有? WaitableTimer 是在 "定时等待", 前面例子中的 WaitForSingleObject 等待函数 "也在等待", 这就 "双重等待" 了, 这不好, 太浪费资源. 其实作为同步工具, 前面的几种方法(事件、信号、临界区)基本够用了; WaitableTimer 的作用并不是为了重复前面的功能, 它的...
阅读全文
posted @
2009-02-18 23:43
万一
阅读(7134)
推荐(0) 编辑
多线程编程(15) - 多线程同步之 WaitableTimer (等待定时器对象)[续]
摘要:本次专门研究下 SetWaitableTimer 的第二个参数(起始时间).它有正值、负值、0值三种情况, 前面已用过 0值.先学习负值(相对时间), 也就是从当前算起隔多长时间开始执行.这个相对时间是以 1/100 纳秒为单位的, 譬如赋值 3*10000000 相当于 3 秒.本例效果图:代码文件:窗体文件:当我们需要一个绝对时间时, 譬如 2009-2-18 13:10:5, 函数需要的 Int64 值应该是个 TFileTime 格式的时间.先看三种相关时间类型(TFileTime、TSystemTime、TDateTime)的定义:下面程序指定在 2009年2月18号下午1点10分5
阅读全文
posted @
2009-02-16 22:58
万一
阅读(6456)
推荐(2) 编辑
多线程编程(14) - 多线程同步之 WaitableTimer (等待定时器对象)
摘要:function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; {安全} bManualReset: BOOL; {True: 可调度多个线程; False: 只调度一个线程} lpTimerName: PWideChar {名称} ): THandle; stdcall; {返回句柄} fu...
阅读全文
posted @
2009-02-16 22:18
万一
阅读(11126)
推荐(2) 编辑
多线程编程(13) - 多线程同步之 Event (事件对象)
摘要:据说 Event(事件对象) 是多线程最原始的同步手段, 我觉得它是最灵活的一个. Event 对象(的句柄表)中主要有两个布尔变量, 从它的建立函数中可以看得清楚: function CreateEvent( lpEventAttributes: PSecurityAttributes; {安全设置} bManualReset: BOOL; ...
阅读全文
posted @
2009-02-16 00:28
万一
阅读(14255)
推荐(0) 编辑
多线程编程(12) - 多线程同步之 Semaphore (信号对象)
摘要:之前已经有了两种多线程的同步方法: CriticalSection(临界区) 和 Mutex(互斥), 这两种同步方法差不多, 只是作用域不同; CriticalSection(临界区) 类似于只有一个蹲位的公共厕所, 只能一个个地进; Mutex(互斥) 对象类似于接力赛中的接力棒, 某一时刻只能一个人持有, 谁拿着谁跑. 什么是 Semaphore(信号或叫信号量)呢? 譬如到银行办业务...
阅读全文
posted @
2009-02-14 22:10
万一
阅读(12173)
推荐(3) 编辑
多线程编程(11) - 多线程同步之 Mutex (互斥对象)[续]
摘要:Mutex 作为系统核心对象是可以跨进程的(临界区就不行), 我们可以利用互斥对象禁止程序重复启动. 工作思路: 先用 OpenMutex 尝试打开一个自定义名称的 Mutex 对象, 如果打开失败说明之前没有这个对象存在; 如果之前没有这个对象, 马上用 CreateMutex 建立一个, 此时的程序应该是第一次启动; 再重复启动时, 那个 OpenMutex 就有结果了, 然后强制退出. ...
阅读全文
posted @
2009-02-13 23:06
万一
阅读(9525)
推荐(0) 编辑
多线程编程(10) - 多线程同步之 Mutex (互斥对象)
摘要:原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitForSingleObject 函数排队等候(等候也可以理解为排队申请). 使用过程: var hMutex: THandle; {应该先声明一个全局的互斥句柄} CreateMutex ...
阅读全文
posted @
2009-02-13 21:25
万一
阅读(13982)
推荐(1) 编辑
多线程编程(9) - 认识等待函数 WaitForSingleObject
摘要:一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单. function WaitForSingleObject( hHandle: THandle; {要等待的对象句柄} ...
阅读全文
posted @
2009-02-13 15:07
万一
阅读(28237)
推荐(2) 编辑
多线程编程(8) - 多线程同步之 CriticalSection(临界区)
摘要:先看一段程序, 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; ...
阅读全文
posted @
2009-02-12 18:15
万一
阅读(18377)
推荐(3) 编辑
多线程编程(7) - 从 CreateThread 说起[续五]
摘要:function CreateThread( lpThreadAttributes: Pointer; {安全设置} dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD...
阅读全文
posted @
2009-02-12 12:31
万一
阅读(12396)
推荐(3) 编辑
多线程编程(6) - 从 CreateThread 说起[续四]
摘要:function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; {堆栈大小} lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWOR...
阅读全文
posted @
2009-02-11 23:18
万一
阅读(12394)
推荐(2) 编辑
多线程编程(5) - 从 CreateThread 说起[续三]
摘要:function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; {入口函数的指针} lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWO...
阅读全文
posted @
2009-02-11 16:21
万一
阅读(14585)
推荐(3) 编辑
多线程编程(4) - 从 CreateThread 说起[续二]
摘要:function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; {入口函数的参数} dwCreationFlags: DWORD; var lpThreadId: DWO...
阅读全文
posted @
2009-02-11 10:42
万一
阅读(16876)
推荐(1) 编辑