多线程编程_3.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多线程编程_3

delphi多线程编程2 在这段程序中, 有三个线程几乎是同时建立, 向窗体中的 ListBox1 中写数据, 最后写出的结果是这样的:      能不能让它们别打架, 一个完了另一个再来? 这就要用到多线程的同步技术.   前面说过, 最简单的同步手段就是 临界区.   先说这个 同步(Synchronize), 首先这个名字起的不好, 我们好像需要的是 异步; 其实异步也不准确...   管它叫什么名字呢, 它的目的就是保证不**、有次序、都发生.   临界区(CriticalSection): 当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 让其他也要执行此代码的线程先等等; 这和前面用的 Lock 和 UnLock 差不多; 使用格式如下: var CS: TRTLCriticalSection;  {声明一个 TRTLCriticalSection 结构类型变量; 它应该是全局的} InitializeCriticalSection(CS); {初始化} EnterCriticalSection(CS);   {开始: 轮到我了其他线程走开} LeaveCriticalSection(CS);   {结束: 其他线程可以来了} DeleteCriticalSection(CS);   {删除: 注意不能过早删除} //也可用 TryEnterCriticalSection 替代 EnterCriticalSection.   用上临界区, 重写上面的代码, 运行效果图:      代码文件:unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)   ListBox1: TListBox;   Button1: TButton;   procedure FormCreate(Sender: TObject);   procedure FormDestroy(Sender: TObject);   procedure Button1Click(Sender: TObject);  end; var  Form1: TForm1; implementation {$R *.dfm} var  CS: TRTLCriticalSection; function MyThreadFun(p: Pointer): DWORD; stdcall; var  i: Integer; begin  EnterCriticalSection(CS);  for i := 0 to 99 do Form1.ListBox1.Items.Add(IntToStr(i));  LeaveCriticalSection(CS);  Result := 0; end; procedure TForm1.Button1Click(Sender: TObject); var  ID: DWORD; begin  CreateThread(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); begin  ListBox1.Align := alLeft;  InitializeCriticalSection(CS); end; procedure TForm1.FormDestroy(Sender: TObject); begin  DeleteCriticalSection(CS); end; end. Delphi 在 SyncObjs 单元给封装了一个 TCriticalSection 类, 用法差不多, 代码如下:unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)   ListBox1: TListBox;   Button1: TButton;   procedure FormCreate(Sender: TObject);   p

文档评论(0)

jjkk585 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档