請問有沒有辦法設定thread同一時間的連線數目 |
答題得分者是:OsX
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
|
OsX
版主 發表:6 回覆:151 積分:111 註冊:2003-05-03 發送簡訊給我 |
不能在 MainForm 中等待建立的 Thread 完成工作. 因為會導致 MainThread (UI)凍結, 有2種做法
1. 一次建立 20 個 TExchange thread , 但是每次只能有3個 thread 執行, 1個 thread 工作結束, 另一個 thread 馬上接下去執行 ( 這就是寫 multi thread 的最常遇到的問題, 要協調多緒之間的同步) 2.若是堅持一定要 thread 執行完後, 才建下一個 thread 繼續工作, 那須要另外建立 1 個 監控 thread 去負責做這件事, 不能在 UI 做 ( MainForm ), 因為會讓主執行緒凍結 試看看下面的程式碼, 你就知道重點在那 MainForm [code delphi] type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FSemaphor: THandle; public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FSemaphor := CreateSemaphore( nil, 3, 3, nil ); end; procedure TForm1.FormDestroy(Sender: TObject); begin CloseHandle( FSemaphor ); end; procedure TForm1.Button1Click(Sender: TObject); var aIndex: Integer; aExchange: TExchange; begin for aIndex := 1 to 20 do begin if ( WaitForSingleObject( FSemaphor, INFINITE ) = WAIT_OBJECT_0 ) then begin aExchange := TExchange.Create( True, FSemaphor ); aExchange.FreeOnTerminate := True; aExchange.Resume; end; end; end; end.[/code] Thread [code delphi] type TExchange = class(TThread) private { Private declarations } FSemaphor: THandle; protected procedure Execute; override; public constructor Create(CreateSuspended:Boolean; ASemaphor: THandle); reintroduce; end; implementation { TExchange } constructor TExchange.Create(CreateSuspended: Boolean; ASemaphor: THandle); begin inherited Create( CreateSuspended ); FSemaphor := ASemaphor; end; procedure TExchange.Execute; begin while not Self.Terminated do begin Sleep( 10000 ); Break; end; ReleaseSemaphore( FSemaphor, 1, nil ); end; [/code] |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |