上一页 1 ··· 70 71 72 73 74 75 76 77 78 ··· 215 下一页
摘要: 在前面例子的基础上, 探讨新问题. 假如我们想让几个线程(例子中是 3 个)依次执行, 我们可以使用临界区、信号、互斥等手段; 但下面第一个例子什么同步工具都没用, 也达到了目的; 方法是: 让前一个线程在结束前顺便启动下一个线程. 第二个例子使用了互斥对象配合 WaitForSingleObject 函数, 也达到相似的目的. 效果图(两个例子的效果图差不多, 但第二个例子的执行顺序不好... 阅读全文
posted @ 2009-02-19 23:46 万一 阅读(9424) 评论(12) 推荐(0) 编辑
摘要: 前面的例子都是让若干线程做同样的事情, 下面这个例子中的三个线程将分别在三个画板上随机画不同颜色的椭圆. 接下来的很多事情我想要基于这个例子来做. 本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, D... 阅读全文
posted @ 2009-02-19 21:17 万一 阅读(12686) 评论(18) 推荐(0) 编辑
摘要: //例子中的三个变量让 absolute 都给弄到一块了, 这有时会很方便; 但我总也想不到用, 还是不熟. procedure TForm1.FormCreate(Sender: TObject); var num: Int64; pt: TPoint absolute num; arr: array[0..1] of Integer absolute pt; begin p... 阅读全文
posted @ 2009-02-19 16:03 万一 阅读(7191) 评论(2) 推荐(1) 编辑
摘要: 根据 WaitableTimer 的主要功用, 现在再把它放在 "线程同步" 的话题中讨论有点不合适了, 就要结束它. //重新看看那个 APC 回调函数的格式: procedure TimerAPCProc( lpArgToCompletionRoutine: Pointer; dwTimerLowValue, dwTimerHighValue: DWORD ); stdcall;... 阅读全文
posted @ 2009-02-19 12:19 万一 阅读(6338) 评论(5) 推荐(0) 编辑
摘要: 喝酒醉了一天, 重装系统一天, 两天没上博客了; 继续学习... 想过没有? WaitableTimer 是在 "定时等待", 前面例子中的 WaitForSingleObject 等待函数 "也在等待", 这就 "双重等待" 了, 这不好, 太浪费资源. 其实作为同步工具, 前面的几种方法(事件、信号、临界区)基本够用了; WaitableTimer 的作用并不是为了重复前面的功能, 它的... 阅读全文
posted @ 2009-02-18 23:43 万一 阅读(7126) 评论(5) 推荐(0) 编辑
摘要: 本次专门研究下 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 万一 阅读(6448) 评论(3) 推荐(2) 编辑
摘要: function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; {安全} bManualReset: BOOL; {True: 可调度多个线程; False: 只调度一个线程} lpTimerName: PWideChar {名称} ): THandle; stdcall; {返回句柄} fu... 阅读全文
posted @ 2009-02-16 22:18 万一 阅读(11108) 评论(17) 推荐(2) 编辑
摘要: 据说 Event(事件对象) 是多线程最原始的同步手段, 我觉得它是最灵活的一个. Event 对象(的句柄表)中主要有两个布尔变量, 从它的建立函数中可以看得清楚: function CreateEvent( lpEventAttributes: PSecurityAttributes; {安全设置} bManualReset: BOOL; ... 阅读全文
posted @ 2009-02-16 00:28 万一 阅读(14235) 评论(15) 推荐(0) 编辑
摘要: 之前已经有了两种多线程的同步方法: CriticalSection(临界区) 和 Mutex(互斥), 这两种同步方法差不多, 只是作用域不同; CriticalSection(临界区) 类似于只有一个蹲位的公共厕所, 只能一个个地进; Mutex(互斥) 对象类似于接力赛中的接力棒, 某一时刻只能一个人持有, 谁拿着谁跑. 什么是 Semaphore(信号或叫信号量)呢? 譬如到银行办业务... 阅读全文
posted @ 2009-02-14 22:10 万一 阅读(12166) 评论(28) 推荐(3) 编辑
摘要: Mutex 作为系统核心对象是可以跨进程的(临界区就不行), 我们可以利用互斥对象禁止程序重复启动. 工作思路: 先用 OpenMutex 尝试打开一个自定义名称的 Mutex 对象, 如果打开失败说明之前没有这个对象存在; 如果之前没有这个对象, 马上用 CreateMutex 建立一个, 此时的程序应该是第一次启动; 再重复启动时, 那个 OpenMutex 就有结果了, 然后强制退出. ... 阅读全文
posted @ 2009-02-13 23:06 万一 阅读(9519) 评论(11) 推荐(0) 编辑
上一页 1 ··· 70 71 72 73 74 75 76 77 78 ··· 215 下一页