線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1831
推到 Plurk!
推到 Facebook!

請問有沒有辦法設定thread同一時間的連線數目

答題得分者是:OsX
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-11 22:18:41 IP:220.132.xxx.xxx 訂閱
比如主程式一直
TExchange.Create(); //thread
,可能有20幾個,但是我想一次連3個數目就好了,直到20個連完就結束。
才是會照成有時候stack overflow的錯誤。

但是又要去寫個List來判斷,在Thread done時再去判斷,再進下一個thread。
請問有沒有設方法屬性的,或方便的方法,可以控制一次同時最多連3個thread就好,自動分批去連完。
OsX
版主


發表:6
回覆:151
積分:111
註冊:2003-05-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-14 18:30:44 IP:220.130.xxx.xxx 未訂閱
不能在 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-17 10:48:34 IP:60.250.xxx.xxx 訂閱
非常棒的方法,用此方法可以順道解決我thread連線去網路太多,造成連結點強制被reset的問題,我還要再試試修入我的程式可不可以動,先謝謝大大囉
系統時間:2024-04-20 5:03:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!