- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
WIN32下DELPHI中的多线程【深入VCL源码】(一)
线程的基础知识
线程的组成。
线程有两部分组成。
1、一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
2、另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。
进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间
中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。
这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。
线程是一种操作系统对象,它表示在进程中代码的一条执行路径。在每一个Win32的应用程序中都至少有一个线程,它通常被称为主线程或默认线程。在应
用程序中也可以自由地创建别的线程去执行其他任务。线程技术使不同的代码可以同时运行。当然,只有在多CPU的计算机上,多个线程才能够真正地同时
运行。在单个CPU上,由于操作系统把CPU的时间分成很短的片段分配给每个线程,这样给人的感觉好像是多个线程真的同时运行,他们只是“看起来”同时
在运行。
Win32是一种抢占式操作系统,操作系统负责管理哪个线程在什么时候执行。如果当线程1暂停执行时,线程2才有机会获得CPU时间,我们说线程1
是抢占的。如果某个线程的代码陷入死循环,这并不可怕,操作系统仍会安排时间给其他线程。
创建一个线程
注意:每个线程必须拥有一个进入点函数,线程从这个进入点开始运行。线程函数可以使用任何合法的名字。可以给线程函数传递单个参数,参数的含义
由你自己定义。线程函数必须由一个返回值,它将成为该线程的退出代码。线程函数应该尽可能的使用函数参数和局部变量。线程函数类似下面的样子(Object
Pascal):
//注意最后的stdcall,后面我会描述一些有用的东西
functionMyThread(info:Pointer):DWORD;stdcall;
var
i:integer;
begin
fori:=0toPinfo(info)^.count-1do
Form1.Canvas.TextOut(Pinfo(info)^.x,Pinfo(info)^.y,inttostr(i));
Result:=0;
end;
上面的的代码功能很简单,你可以在程序中直接调用,例如这样:
type
Tinfo=record
count:integer;
x:integer;
y:integer;
end;
Pinfo=^Tinfo;
...
procedureTForm1.Button4Click(Sender:TObject);
var
ppi:Pinfo;
begin
ppi:=AllocMem(sizeof(tinfo));
ppi^.count:=1000000;
ppi^.x:=100;
ppi^.y:=400;
MyThread(ppi);
end;
当你在一个窗口中用这样的方式调用时,你会发现在执行的过程中,你将无法在窗口上进行其他操作,因为它工作于你程序的主线程之中。如果此时,你
还希望窗口可以进行其他操作。怎么办?让它在后台工作,让它成为另一个线程,使得不同的代码可以同时运行。
做法很简单,如果想要创建一个或多个辅助线程,只需要让一个已经在运行的线程来调用CreateThread,原型如下:
HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,//pointertothreadsecurityattributes
DWORDdwStackSize,//initialthreadstacksize,inbytes
LPTHREAD_START_ROUTINElpStartAddress,//pointertothreadfunction
LPVOIDlpParameter,//argumentfornewthread
DWORDdwCreationFlags,//creationflags
LPDWORDlpThreadId//pointertoreturnedthreadidentifier
);
当CreateThread,被调用时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的
您可能关注的文档
最近下载
- 基层儿科医务人员服务能力提升学习班答案-2024华医网继续教育答案.docx VIP
- 中学生素质发展评价手册42p.pdf VIP
- 《反对党八股》名师教学课件 (1).pptx VIP
- 薛法根:《风娃娃》(二年级).docx
- 40篇英语短文搞定高考3500个单词(全部含翻译-重点解析).doc
- SY∕T 4113.7-2020 管道防腐层性能试验方法 第7部分:厚度测试.pdf
- 阿里全球数学竞赛姜萍成绩造假PPT课件.pptx VIP
- FM知识考试试题-必做经典大题.pdf
- 旅游管理职业生涯规划.pdf
- 江苏省南京市2025届高三零模作文“点外卖”与“送外卖”导写(真题呈现+审题立意+素材积累+写作示例+考场范文).docx VIP
文档评论(0)