![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
delphi - 多线程
阳光C
这个作者很懒,什么都没留下…
展开
-
DELPHI 线程的终止和退出
<br />1)自动退出:<br /> 一个线程从execute()过程中退出,即意味着线程的终止,此时将调用windows的exitthread()函数来清除线程所占用的堆栈。<br /> 如果线程对象的 freeonterminate 属性设为true,则线程对象将自动删除,并释放线程所占用的资源。<br /> 这是消除线程对象最简单的办法。<br /> 2)受控退出:<br /> 利用线程对象的terminate属性,可以由进程或者由其他线程控制线程的退出。只需要简单的调用该线程的转载 2010-08-29 00:25:00 · 4549 阅读 · 1 评论 -
多线程编程(11) - 多线程同步之 Mutex (互斥对象)[续]
<br />Mutex 作为系统核心对象是可以跨进程的(临界区就不行), 我们可以利用互斥对象禁止程序重复启动.<br /><br />工作思路:<br />先用 OpenMutex 尝试打开一个自定义名称的 Mutex 对象, 如果打开失败说明之前没有这个对象存在;<br />如果之前没有这个对象, 马上用 CreateMutex 建立一个, 此时的程序应该是第一次启动;<br />再重复启动时, 那个 OpenMutex 就有结果了, 然后强制退出.<br />最后在程序结束时用 CloseHandle转载 2010-11-09 23:24:00 · 639 阅读 · 0 评论 -
多线程编程(10) - 多线程同步之 Mutex (互斥对象)
原理分析:互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用.其他线程可用 WaitForSingleObject 函数排队等候(等候也可以理解为排队申请).使用过程:var hMutex: THandle; {应该先声明一个全局的互斥句柄}CreateMutex {建立一个互斥对象}WaitForSingleObject {用等待函数排队等候}Re转载 2010-11-08 23:31:00 · 391 阅读 · 0 评论 -
多线程编程(12) - 多线程同步之 Semaphore (信号对象)
<br />之前已经有了两种多线程的同步方法:<br />CriticalSection(临界区) 和 Mutex(互斥), 这两种同步方法差不多, 只是作用域不同;<br />CriticalSection(临界区) 类似于只有一个蹲位的公共厕所, 只能一个个地进; <br />Mutex(互斥) 对象类似于接力赛中的接力棒, 某一时刻只能一个人持有, 谁拿着谁跑.<br /><br />什么是 Semaphore(信号或叫信号量)呢?<br />譬如到银行办业务、或者到车站买票, 原来只有一个服务员,转载 2010-11-12 23:01:00 · 503 阅读 · 0 评论 -
多线程编程(13) - 多线程同步之 Event (事件对象)
<br />据说 Event(事件对象) 是多线程最原始的同步手段, 我觉得它是最灵活的一个.<br />Event 对象(的句柄表)中主要有两个布尔变量, 从它的建立函数中可以看得清楚:<br />function CreateEvent( lpEventAttributes: PSecurityAttributes; {安全设置} bManualReset: BOOL; {第一个布尔} bInitialState: BOOL;转载 2010-11-14 23:50:00 · 386 阅读 · 0 评论 -
多线程编程(14) - 多线程同步之 WaitableTimer (等待定时器对象)
function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; {安全} bManualReset: BOOL; {True: 可调度多个线程; False: 只调度一个线程} lpTimerName: PWideChar {名称}): THandle; stdcall; {返回句柄}function SetWaitableTimer( hTimer: THandle;转载 2010-11-15 19:54:00 · 460 阅读 · 0 评论 -
多线程编程(15) - 多线程同步之 WaitableTimer (等待定时器对象)[续]
<br />本次专门研究下 SetWaitableTimer 的第二个参数(起始时间).<br />它有正值、负值、0值三种情况, 前面已用过 0值.<br />先学习负值(相对时间), 也就是从当前算起隔多长时间开始执行.<br /><br />这个相对时间是已 1/100 纳秒为单位的, 譬如赋值 3*10000000 相当于 3 秒.<br />1 s(秒) = 1,000 ms(毫秒);1 s(秒) = 1,000,000 µs(微妙);1 s(秒)转载 2010-11-15 20:32:00 · 496 阅读 · 0 评论 -
多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)[续二]
<br />喝酒醉了一天, 重装系统一天, 两天没上博客了; 继续学习...<br /><br />想过没有? WaitableTimer 是在 "定时等待", 前面例子中的 WaitForSingleObject 等待函数 "也在等待", 这就 "双重等待" 了, 这不好, 太浪费资源.<br /><br />其实作为同步工具, 前面的几种方法(事件、信号、临界区)基本够用了; WaitableTimer 的作用并不是为了重复前面的功能, 它的主要功用类似 TTimer 类; 譬如每隔多长时间执行一段代码转载 2010-11-15 20:33:00 · 589 阅读 · 0 评论 -
多线程编程(17) - 多线程同步之 WaitableTimer (等待定时器对象)[续三]
<br />根据 WaitableTimer 的主要功用, 现在再把它放在 "线程同步" 的话题中讨论有点不合适了, 就要结束它.<br />//重新看看那个 APC 回调函数的格式:procedure TimerAPCProc( lpArgToCompletionRoutine: Pointer; dwTimerLowValue, dwTimerHighValue: DWORD); stdcall;<br /><br />TimerAPCProc 的后两个参数其实是在传递一个值,转载 2010-11-21 01:16:00 · 479 阅读 · 0 评论 -
多线程编程(19) - 不使用同步工具, 手动协调线程依次执行
<br />在前面例子的基础上, 探讨新问题.<br /><br />假如我们想让几个线程(例子中是 3 个)依次执行, 我们可以使用临界区、信号、互斥等手段;<br />但下面第一个例子什么同步工具都没用, 也达到了目的; 方法是: 让前一个线程在结束前顺便启动下一个线程.<br /><br />第二个例子使用了互斥对象配合 WaitForSingleObject 函数, 也达到相似的目的. <br /><br />效果图(两个例子的效果图差不多, 但第二个例子的执行顺序不好保证):<br /><br /转载 2010-11-21 01:22:00 · 422 阅读 · 0 评论 -
非官方的 TWaitableTimer 类
unit WTimer;interfaceuses Windows, SysUtils, SyncObjs;type TWaitableTimer = class(TSynchroObject) protected FHandle: THandle; FPeriod: LongInt; FDueTime: TDateTime; FLastError: Integer; FLongTime: Int64; publicc转载 2010-11-21 01:23:00 · 397 阅读 · 0 评论 -
多线程编程(1) - 先入门再说
多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样).开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个:procedure TForm1.Button1Click(Sender:转载 2010-10-28 19:47:00 · 438 阅读 · 0 评论 -
多线程编程(9) - 认识等待函数 WaitForSingleObject
<br />一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单.<br />function WaitForSingleObject( hHandle: THandle; {要等待的对象句柄} dwMilliseconds: DWORD {等待的时间, 单位是毫秒}): DW转载 2010-11-06 23:14:00 · 480 阅读 · 0 评论 -
多线程编程(6) - 从 CreateThread 说起[续四]
function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; {堆栈大小} lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;<br /><br />CreateThread 的转载 2010-11-06 00:26:00 · 350 阅读 · 0 评论 -
再谈在Delphi中利用线程
<br />南京陆军指挥学院研究生队 李晓峰<br /><br /> Delphi 的VCL(Visual Component Library) 和RTL(Run-Time Library) 库把几乎全部的Windows API 函数封装起来,而且在其基础上增加了一些安全措施。在实际运用时,程序员几乎没有必要直接调用Windows API 函数,利用各单元所提供的函数库或例程库就可直接对系统低层进行操作。<br /> 今年8 月10 日,第30 期《计算机世界》G18 版上刊登了一篇《〈在Delphi转载 2010-08-29 00:22:00 · 608 阅读 · 0 评论 -
delphi 线程类
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以有多个子线程.当一个进程中用到超过一个线程时,就是所谓的"多线程". 那么这个所谓的"一段代码"是如何定义的呢?其实就是一转载 2010-08-29 00:22:00 · 304 阅读 · 0 评论 -
多线程内容匹配抓取(线程池)
<br />多线程内容匹配抓取(2009-03-26 15:36:52)说明:在线程池控制本线程时,同时使用下面3个全局变量 <br />catch_urllist: TList; 待抓取的URL结构列表<br />matching_urllist: TList; 符合内容的URL结构列表<br />error_urllist: TStrings; 不符合内容的URL<br />*************************************************************转载 2010-08-29 00:26:00 · 636 阅读 · 0 评论 -
在delphi中如何判断线程终止
<br />能不能判断线程的状态,是运行,还是挂起呀?怎样得知线程结束了? <br />我做了一个线程队列,用队列管理线程,可是无法得知哪个线程是否结束了,然后让结束了的线程重新启动? <br />Obj: TQueryThread <br />用delphi的TThread类实现 <br />用什么方法可知线程结束了,我用线程句柄,有的线程结束了,但句柄不是0 <br />请问用什么方法判断线程结束了?然后重启结束的线程<br />楼上的一些方法都说了,我多说一点 <br /><br />根据WIN32平转载 2010-08-29 00:25:00 · 3843 阅读 · 0 评论 -
多线程编程
<br />转载:http://www.cnblogs.com/dingjie/archive/2005/07/13/192021.html<br />1-1 多线程的基本概念<br /><br /> WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说,把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和“唤醒”,由于时间片很小,给人的感觉是同时运行的。<br /> 多线程带来如下好处:转载 2010-09-06 00:02:00 · 324 阅读 · 0 评论 -
多线程编程(7) - 从 CreateThread 说起[续五]
function CreateThread( lpThreadAttributes: Pointer; {安全设置} dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;CreateThread 的第一个参数 lpThrea转载 2010-11-06 22:05:00 · 291 阅读 · 0 评论 -
多线程编程(8) - 多线程同步之 CriticalSection(临界区)
<br />先看一段程序, 代码文件: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure FormCreate(转载 2010-11-06 22:27:00 · 463 阅读 · 0 评论 -
多线程编程(2) - 从 CreateThread 说起
function CreateThread(<br /> lpThreadAttributes: Pointer; {安全设置}<br /> dwStackSize: DWORD; {堆栈大小}<br /> lpStartAddress: TFNThreadStartRoutine; {入口函数}<br /> lpParameter: Pointer; {函数参数}<br /> dwCreationFlag转载 2010-11-05 20:50:00 · 318 阅读 · 0 评论 -
多线程编程(3) - 从 CreateThread 说起[续]
function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; {启动选项}var lpThreadId: DWORD): THandle; stdcall;<br /><br />CreateThread 的倒数第二个参数转载 2010-11-05 21:17:00 · 382 阅读 · 0 评论 -
多线程编程(4) - 从 CreateThread 说起[续二]
function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; {入口函数的参数} dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;<br /><br />线程入口函数的参数是个无类转载 2010-11-05 21:36:00 · 422 阅读 · 0 评论 -
多线程编程(5) - 从 CreateThread 说起[续三]
function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; {入口函数的指针} lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;<br /><br />到了入口函数了, 学到这个转载 2010-11-05 23:47:00 · 356 阅读 · 0 评论 -
多线程编程(18) - 再从一个小例子出发
前面的例子都是让若干线程做同样的事情, 下面这个例子中的三个线程将分别在三个画板上随机画不同颜色的椭圆.接下来的很多事情我想要基于这个例子来做. 本例效果图:代码文件: unit Unit1;interfaceuses转载 2010-11-21 01:18:00 · 357 阅读 · 0 评论