delphi与多线程编程之多线程同步之 CriticalSection.pdf
《delphi与多线程编程之多线程同步之 CriticalSection.pdf》由会员分享,可在线阅读,更多相关《delphi与多线程编程之多线程同步之 CriticalSection.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、function CreateThread(lpThreadAttributes:Pointer;dwStackSize:DWORD;lpStartAddress:TFNThreadStartRoutine;入口函数的指针lpParameter:Pointer;dwCreationFlags:DWORD;var lpThreadId:DWORD):THandle;stdcall;-到了入口函数了,学到这个地方,我查了一个入口函数的标准定义,这个函数的标准返回值应该 是DWORD,不过 这函 数在Delphi 的System 单元 定义 的是:TThreadFunc=function(Param
2、eter:Pointer):Integer;我以后会尽量使用 DWORD 做入口函数的返回值.这个返回值有什么用呢?等线程退出后,我们用 GetExitCodeThread 函数获取的退出码就是这个返回值!如果线程没有退出,GetExitCodeThread 获取的退出码将是一个常量 STILL_ACTIVE(259);这样我们就可以通过退出码来判断线程是否已退出.还有一个问题:前面也提到过,线程函数不能是某个类的方法!假如我们非要线程去执行类中的一个方法能否实现呢?尽管可以用 Addr(类名.方法名)或 MethodAddress(published 区的方法名)获取类中方法的地址,但都不能
3、当做线程的入口函数,原因可能是因为类中的方法的地址是在实例化为对象时动态分配的.后来换了个思路,其实很简单:在线程函数中再调用方法不就得了,估计 TThread 也应该是这样.下面的例子就尝试了用线程调用 TForm1 类中的方法,并测试了退出码的相关问题.本例效果图:-代码文件:-unit Unit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTForm1=class(TForm)Button1:TButton;Button2:TBu
4、tton;procedureButton1Click(Sender:TObject);procedureButton2Click(Sender:TObject);privateprocedureFormProc;准备给线程使用的方法end;varForm1:TForm1;implementation$R*.dfmvarhThread:THandle;线程入口函数function MyThreadFun(p:Pointer):DWORD;stdcall;beginForm1.FormProc;调用 TForm1 类的方法Result:=99;这个返回值将成为线程的退出代码,99 是我随意给的数字
5、end;TForm1 的方法,本例中是给线程的入口函数调用的procedureTForm1.FormProc;vari:Integer;beginfori:=0 to 200000 dobeginwith Form1.Canvas do beginLock;TextOut(10,10,IntToStr(i);Unlock;end;end;end;建立并执行线程procedureTForm1.Button1Click(Sender:TObject);varID:DWORD;beginhThread:=CreateThread(nil,0,MyThreadFun,nil,0,ID);end;获取线
6、程的退出代码,并判断线程是否退出procedureTForm1.Button2Click(Sender:TObject);varExitCode:DWORD;beginGetExitCodeThread(hThread,ExitCode);ifhThread=0 thenbeginText:=线程还未启动;Exit;end;ifExitCode=STILL_ACTIVE thenText:=Format(线程退出代码是:%d,表示线程还未退出,ExitCode)elseText:=Format(线程已退出,退出代码是:%d,ExitCode);end;end.-窗体文件:-object For
7、m1:TForm1Left=0Top=0Caption=Form1ClientHeight=84ClientWidth=376Color=clBtnFaceFont.Charset=DEFAULT_CHARSETFont.Color=clWindowTextFont.Height=-11Font.Name=TahomaFont.Style=OldCreateOrder=FalsePixelsPerInch=96TextHeight=13object Button1:TButtonLeft=183Top=32Width=75Height=25Caption=Button1TabOrder=0On
8、Click=Button1Clickendobject Button2:TButtonLeft=280Top=32Width=75Height=25Caption=Button2TabOrder=1OnClick=Button2Clickendendfunction CreateThread(lpThreadAttributes:Pointer;dwStackSize:DWORD;堆栈大小lpStartAddress:TFNThreadStartRoutine;lpParameter:Pointer;dwCreationFlags:DWORD;var lpThreadId:DWORD):THa
9、ndle;stdcall;-CreateThread 的第二个参数是分配给线程的堆栈大小.这首先这可以让我们知道:每个线程都有自己独立的堆栈(也拥有自己的消息队列).什么是堆栈?其实堆是堆、栈是栈,有时栈也被叫做堆栈.它们都是进程中的内存区域,主要是存取方式不同(栈:先进后出;堆:先进先出);栈(或叫堆栈)适合存取临时而轻便的变量,主要用来储存局部变量;譬如 fori:=0 to 99do 中的i就只能存于栈中,你把一个全局的变量用于 for 循环计数是不可以的.现在我们知道了线程有自己的栈,并且在建立线程时可以分配栈的大小.前面所有的例子中,这个值都是 0,这表示使用系统默认的大小,默认和主
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- delphi与多线程编程之多线程同步之 CriticalSection delphi 多线程 编程 之多 线程 同步
限制150内