unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTMyThread = class(TThread)private{ Private declarations }protectedprocedure Execute; override;procedure Run;end;TForm1 = class(TForm)btn1: TButton;btn2: TButton;btn3: TButton;btn4: TButton;procedure btn1Click(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure btn2Click(Sender: TObject);procedure btn3Click(Sender: TObject);procedure btn4Click(Sender: TObject);procedure FormCreate(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}uses SyncObjs;varf:integer;MyEvent:TEvent;MyThread:TMyThread;{ TMyThread }procedure TMyThread.Execute;begininherited;FreeOnTerminate:=True; {线程使用完自己注销}Run;end;procedure TMyThread.Run;vari,y:integer;beginInc(f);y:=20*f;for i := 0 to 20000 dobeginif MyEvent.WaitFor(INFINITE)=wrSignaled then{判断事件在用没,配合事件的启动和暂停,对事件相关线程起统一控制}beginForm1.Canvas.lock;Form1.Canvas.TextOut(10,y,IntToStr(i));Form1.Canvas.Unlock;Sleep(1);end;end;end;procedure TForm1.btn1Click(Sender: TObject);beginRepaint;f:=0;if Assigned(MyEvent) then MyEvent.Free;{如果有,就先销毁}{参数1安全设置,一般为空;参数2为True时可手动控制暂停,为Flase时对象控制一次后立即暂停参数3为True时对象建立后即可运行,为false时对象建立后控制为暂停状态,参数4为对象名称,用于跨进程,不用时默认''}MyEvent:=TEvent.Create(nil,True,True,'');{创建事件}end;procedure TForm1.btn2Click(Sender: TObject);varID:DWORD;beginMyThread:=TMyThread.Create(False);{创建线程}end;procedure TForm1.btn3Click(Sender: TObject);beginMyEvent.SetEvent;{启动}{事件类没有PulseEvent启动一次后轻描谈写}end;procedure TForm1.btn4Click(Sender: TObject);beginMyEvent.ResetEvent;{暂停}end;procedure TForm1.FormCreate(Sender: TObject);beginbtn1.Caption:='创建事件';btn2.Caption:='创建线程';btn3.Caption:='启动';btn4.Caption:='暂停';end;procedure TForm1.FormDestroy(Sender: TObject);beginMyEvent.Free;{释放}end;end.Synchronize最后来聊聊这个 Synchronize 函数,至于原因是将该线程的代码放到主线程中运行,并非实际意义的线程同步 。RAD Studio VCL Reference 中也有描述
Executes a method call within the main thread,Synchronize causes the call specified by AMethod() to be executed using the main thread,,thereby avoiding multi-thread conflicts 。
谷歌译文:在主线程中执行方法调用,同步导致指定的呼叫用于使用主线程执行的可用于执行的次数,从而避免多线程冲突
另外一个原因是个人感觉它不够灵活,比如我只需要同步核心运算部分的代码,其他部分并不需要同步的情况,所以我不太推荐 。可能是我的姿势不对,在控制台应用下无法使用,只能回到VCL中
//开启控制台的指令{$APPTYPE CONSOLE}interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;typeTSyncThread = class(TTHread)procedure Execute; override;publicprocedure Work();end;varNum: Integer = 0;varForm1: TForm1;implementation{$R *.dfm}{ TSyncThread }procedure TSyncThread.Execute;begininherited;Synchronize(Work);end;procedure TSyncThread.Work;begin// 循环的方式自增Numwhile True do beginTTHread.Sleep(100);// 当Num的值大于10则终止线程if (Num > 10) thenExit;Writeln(TTHread.CurrentThread.ThreadID.ToString + ':' + Num.ToString);Inc(Num);end;end;procedure TForm1.Button1Click(Sender: TObject);beginTSyncThread.Create(false);end;end.至此Delphi多线程已知的同步方案结束了 。通常Delphi中会提供两种方案一是原生API方式二是Delphi本身封装的
这篇文章也是Delphi图文版的最后一篇文章了,至此第一季相关的内容全部更新完成
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 电脑桌面字体大小设置方法 win10添加字体在哪里设置
- java开发需要掌握的技术 java开发平台有哪些
- webpack5和4的区别 webpack使用教程
- java项目开发实例 java系统架构有哪些
- 投诉物业收费不开发票的举报信怎么写最管用?
- vim配置c语言开发环境 vim简单配置教程
- 团油app加油靠谱吗?团油app是哪个公司开发的?
- 国家开发银行助学贷款信息网 国家开发银行生源地助学贷款系统
- 自己做游戏软件的app推荐 app游戏开发需要多少钱
- 十分钟配置Mac OS主题 ubuntu桌面美化mac