亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

web開發(fā)桌面應(yīng)用程序 delphi開發(fā)安卓步驟( 二 )


篇幅的原因,我截取其中的一段結(jié)果,但是已經(jīng)足以說明問題所在
解決方案對于我們自己來說解決起來好像確實(shí)很麻煩,好在我們的前輩已經(jīng)提供了解決方案 。不學(xué)不知道,一學(xué)嚇一跳,Delphi針對線程安全問題提供了不止一種解決方案 。
臨界區(qū)臨界區(qū)是一種最直接的線程同步方式 。所謂臨界區(qū),簡單的說就是有一塊區(qū)域,而在該區(qū)域內(nèi)的代碼只能有一個線程在執(zhí)行 。針對臨界區(qū)的使用Delphi中有兩種方式使用EnterCriticalSection( ) 和LeaveCriticalSection( ) API 函數(shù),另外一種是使用 TCriticalSection 類,我個人推薦使用TCriticalSection 因?yàn)樵擃悓PI進(jìn)行了封裝使用更為便捷 。所在的單元為“SyncObjs”
在理清臨界區(qū)的概念之后我們改組上述代碼
program Project1;{$APPTYPE CONSOLE}{$R *.res}usesSyncObjs, System.SysUtils, System.Classes;typeTWorkThread = class(TThread)protectedprocedure Execute; override;publicend;var// 定義全局變量,充當(dāng)共享數(shù)據(jù)Num: Integer = 0;var{ 聲明臨界 }CS: TCriticalSection;{ TWorkThread }procedure TWorkThread.Execute;begin// 循環(huán)的方式自增Numwhile True do beginTThread.Sleep(100);// 臨界區(qū)開始CS.Enter;// 當(dāng)Num的值大于10則終止線程if (Num > 10) thenExit;Writeln(TThread.CurrentThread.ThreadID.ToString + ':' + Num.ToString);Inc(Num);// 臨界區(qū)結(jié)束CS.Leave;end;end;begin//初始化臨界區(qū)CS := TCriticalSection.Create;TWorkThread.Create(False);TWorkThread.Create(False);TWorkThread.Create(False);Readln;end.互斥對象uses SyncObjs;用TMutex類的方法處理(把釋放語句放在循環(huán)內(nèi)外可以決定執(zhí)行順序)
例:互斥輸出三個0~2000的數(shù)字到窗體在不同位置 。
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTMyThread = class(TThread)private{ Private declarations }protectedprocedure Execute; override; {執(zhí)行}procedure Run;{運(yùn)行}end;TForm1 = class(TForm)btn1: TButton;procedure FormDestroy(Sender: TObject);procedure btn1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}uses SyncObjs;varMyThread:TMyThread;{聲明線程}Mutex:TMutex; {聲明互斥體}f:integer;procedure TMyThread.Execute;begin{ Place thread code here }FreeOnTerminate:=True; {加上這句線程用完了會自動注釋}Run;{運(yùn)行}end;procedure TMyThread.Run;vari,y:integer;beginInc(f);y:=20*f;for i := 0 to 2000dobeginif Mutex.WaitFor(INFINITE)=wrSignaled then{判斷函數(shù),能用時就用}beginForm1.Canvas.Lock;Form1.Canvas.TextOut(10,y,IntToStr(i));Form1.Canvas.Unlock;Sleep(1);Mutex.Release; {釋放,誰來接下去用}end;end;end;procedure TForm1.btn1Click(Sender: TObject);beginf:=0;Repaint;Mutex:=TMutex.Create(False);{參數(shù)為是否讓創(chuàng)建者擁有該互斥體,一般為False}MyThread:=TMyThread.Create(False);MyThread:=TMyThread.Create(False);MyThread:=TMyThread.Create(False);end;procedure TForm1.FormDestroy(Sender: TObject);beginMutex.Free;{釋放互斥體}end;end.Semaphore(信號或叫信號量)unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Edit1: TEdit;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Edit1KeyPress(Sender: TObject; var Key: Char);end;varForm1: TForm1;implementation{$R *.dfm}uses SyncObjs;varf: Integer;MySemaphore: TSemaphore;function MyThreadFun(p: Pointer): DWORD; stdcall;vari,y: Integer;beginInc(f);y := 20 * f;if MySemaphore.WaitFor(INFINITE) = wrSignaled thenbeginfor i := 0 to 1000 dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(20, y, IntToStr(i));Form1.Canvas.Unlock;Sleep(1);end;end;MySemaphore.Release;Result := 0;end;procedure TForm1.Button1Click(Sender: TObject);varThreadID: DWORD;beginif Assigned(MySemaphore) then MySemaphore.Free;MySemaphore := TSemaphore.Create(nil, StrToInt(Edit1.Text), 5, ''); {創(chuàng)建,參數(shù)一為安全默認(rèn)為nil,參數(shù)2可以填寫運(yùn)行多少線程,參數(shù)3是運(yùn)行總數(shù),參數(shù)4可命名用于多進(jìn)程}Self.Repaint;f := 0;CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);end;{讓 Edit 只接受 1 2 3 4 5 五個數(shù)}procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);beginif not CharInSet(Key, ['1'..'5']) then Key := #0;end;procedure TForm1.FormCreate(Sender: TObject);beginEdit1.Text := '1';end;procedure TForm1.FormDestroy(Sender: TObject);beginif Assigned(MySemaphore) then MySemaphore.Free;end;end.Event (事件對象)注:相比API的處理方式,此類沒有啟動步進(jìn)一次后暫停的方法 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: