delphi多线程编程2

上传人:枫** 文档编号:431493582 上传时间:2023-01-23 格式:DOC 页数:15 大小:228KB
返回 下载 相关 举报
delphi多线程编程2_第1页
第1页 / 共15页
delphi多线程编程2_第2页
第2页 / 共15页
delphi多线程编程2_第3页
第3页 / 共15页
delphi多线程编程2_第4页
第4页 / 共15页
delphi多线程编程2_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《delphi多线程编程2》由会员分享,可在线阅读,更多相关《delphi多线程编程2(15页珍藏版)》请在金锄头文库上搜索。

1、delphi多线程编程2在这段程序中, 有三个线程几乎是同时建立, 向窗体中的 ListBox1 中写数据, 最后写出的结果是这样的:能不能让它们别打架, 一个完了另一个再来? 这就要用到多线程的同步技术.前面说过, 最简单的同步手段就是 临界区.先说这个 同步(Synchronize), 首先这个名字起的不好, 我们好像需要的是 异步; 其实异步也不准确.管它叫什么名字呢, 它的目的就是保证不*、有次序、都发生.临界区(CriticalSection): 当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 让其他也要执行此代码的线程先等等; 这和前面用的 Lock 和 UnLock

2、差不多; 使用格式如下:var CS: TRTLCriticalSection; 声明一个 TRTLCriticalSection 结构类型变量; 它应该是全局的InitializeCriticalSection(CS); 初始化EnterCriticalSection(CS);开始: 轮到我了其他线程走开LeaveCriticalSection(CS);结束: 其他线程可以来了DeleteCriticalSection(CS); 删除: 注意不能过早删除/也可用 TryEnterCriticalSection 替代 EnterCriticalSection.用上临界区, 重写上面的代码, 运

3、行效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)ListBox1: TListBox;Button1: TButton;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Button1Click(Sender: TObje

4、ct);end;varForm1: TForm1;implementation$R *.dfmvarCS: TRTLCriticalSection;function MyThreadFun(p: Pointer): DWORD; stdcall;vari: Integer;beginEnterCriticalSection(CS);for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i);LeaveCriticalSection(CS);Result := 0;end;procedure TForm1.Button1Click(Sende

5、r: TObject);varID: DWORD;beginCreateThread(nil, 0, MyThreadFun, nil, 0, ID);CreateThread(nil, 0, MyThreadFun, nil, 0, ID);CreateThread(nil, 0, MyThreadFun, nil, 0, ID);end;procedure TForm1.FormCreate(Sender: TObject);beginListBox1.Align := alLeft;InitializeCriticalSection(CS);end;procedure TForm1.Fo

6、rmDestroy(Sender: TObject);beginDeleteCriticalSection(CS);end;end.Delphi 在 SyncObjs 单元给封装了一个 TCriticalSection 类, 用法差不多, 代码如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)ListBox1: TListBox;Button1: TButto

7、n;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation$R *.dfmuses SyncObjs;varCS: TCriticalSection;function MyThreadFun(p: Pointer): DWORD; stdcall;vari: Integer;beginCS.Enter;for i := 0 to 99 do For

8、m1.ListBox1.Items.Add(IntToStr(i);CS.Leave;Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);varID: DWORD;beginCreateThread(nil, 0, MyThreadFun, nil, 0, ID);CreateThread(nil, 0, MyThreadFun, nil, 0, ID);CreateThread(nil, 0, MyThreadFun, nil, 0, ID);end;procedure TForm1.FormCreate(Sender

9、: TObject);beginListBox1.Align := alLeft;CS := TCriticalSection.Create;end;procedure TForm1.FormDestroy(Sender: TObject);beginCS.Free;end;end.多线程编程(9) - 认识等待函数 WaitForSingleObject。 一下子跳到等待函数 WaitForSingleObject, 是因为下面的Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止WaitForSingleObject 它一

10、个, 但它最简单.function WaitForSingleObject(hHandle: THandle;要等待的对象句柄dwMilliseconds: DWORD等待的时间, 单位是毫秒): DWORD; stdcall; 返回值如下:WAIT_OBJECT_0等着了, 本例中是: 等的那个进程终于结束了WAIT_TIMEOUT 等过了点(你指定的时间), 也没等着WAIT_ABANDONED 好不容易等着了, 但人家还是不让咱执行; 这一般是互斥对象/WaitForSingleObject 的第二个参数一般给常数值 INFINITE, 表示一直等下去, 死等.WaitForSingle

11、Object 等待什么? 在多线程里就是等待另一个线程的结束, 快来执行自己的代码; 不过它可以等待的对象可不止线程; 这里先来一个等待另一个进程结束的例子, 运行效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);end;varForm

12、1: TForm1;implementation$R *.dfmvarhProcess: THandle; 进程句柄等待一个指定句柄的进程什么时候结束function MyThreadFun(p: Pointer): DWORD; stdcall;beginif WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 thenForm1.Text := Format(进程 %d 已关闭, hProcess);Result := 0;end;启动一个进程, 并建立新线程等待它的结束procedure TForm1.Button1Click(

13、Sender: TObject);varpInfo: TProcessInformation;sInfo: TStartupInfo;Path: array0.MAX_PATH-1 of Char;ThreadID: DWORD;begin先获取记事本的路径GetSystemDirectory(Path, MAX_PATH);StrCat(Path, notepad.exe);用 CreateProcess 打开记事本并获取其进程句柄, 然后建立线程监视FillChar(sInfo, SizeOf(sInfo), 0);if CreateProcess(Path, nil, nil, nil,

14、 False, 0, nil, nil, sInfo, pInfo) thenbeginhProcess := pInfo.hProcess; 获取进程句柄Text := Format(进程 %d 已启动, hProcess);CreateThread(nil, 0, MyThreadFun, nil, 0, ThreadID); 建立线程监视end;end;end.窗体文件:object Form1: TForm1Left = 0Top = 0Caption = Form1ClientHeight = 124ClientWidth = 241Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = TahomaFont.Style = OldCreateOrder = FalsePixelsPerInch = 96TextHeight = 13object

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 工业自动化

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号