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

關於Thread效能問題

答題得分者是:syntax
jim1247
一般會員


發表:8
回覆:20
積分:5
註冊:2003-01-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-29 11:56:22 IP:61.222.xxx.xxx 未訂閱
當Thread的Execute在處理迴圈時, 是否會把整個CPU效能吃光?
有個需求是當Create後, 在Execute中不斷處理一個Procedure, 直到我按下Button後才Suspend
但是我才Create 1個Thread就吃掉我50%資源, 更不用說要Create 100個以上了
使用D7, 以下是我的code

[code delphi]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TProcessThread = class(TThread)
private
FState: Boolean;
protected
procedure Execute; override;
public
property State: Boolean read FState write FState;
constructor Create; overload;
end;

TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
ProcessThread: array of TProcessThread;
public
ThreadCount: Integer;
end;

var
Form2: TForm2;

implementation
{$R *.dfm}
constructor TProcessThread.Create;
begin
inherited Create(False);
FState := True;
end;

procedure TProcessThread.Execute;
begin
while (FState) do
begin
{ 要處理的程式碼 }
end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
begin
ThreadCount := StrToIntDef(Edit1.Text,1);
if (ThreadCount>0) then
begin
SetLength(ProcessThread,ThreadCount);
try
for i:=0 to ThreadCount-1 do
begin
ProcessThread[i] := TProcessThread.Create;
end;
except
end;
end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
i: Integer;
begin
for i:=0 to ThreadCount-1 do
begin
ProcessThread[i].State := False;
end;
end;

end.

[/code]
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-29 16:09:27 IP:61.64.xxx.xxx 訂閱
反問你一個問題

如果當下只有你的 Thread 在執行,你希望他只用 10% 的 CPU ,然後用 10 倍的時間才完成你的工作嗎?
還是由系統幫他安排適當的 Time Frame,然後儘速完成工作?

===================引 用 jim1247 文 章===================
當Thread的Execute在處理迴圈時, 是否會把整個CPU效能吃光?
有個需求是當Create後, 在Execute中不斷處理一個Procedure, 直到我按下Button後才Suspend
但是我才Create 1個Thread就吃掉我50%資源, 更不用說要Create 100個以上了
使用D7, 以下是我的code

[code delphi]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TProcessThread = class(TThread)
private
FState: Boolean;
protected
procedure Execute; override;
public
property State: Boolean read FState write FState;
constructor Create; overload;
end;

TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
ProcessThread: array of TProcessThread;
public
ThreadCount: Integer;
end;

var
Form2: TForm2;

implementation
{$R *.dfm}
constructor TProcessThread.Create;
begin
inherited Create(False);
FState := True;
end;

procedure TProcessThread.Execute;
begin
while (FState) do
begin
{ 要處理的程式碼 }
end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
begin
ThreadCount := StrToIntDef(Edit1.Text,1);
if (ThreadCount>0) then
begin
SetLength(ProcessThread,ThreadCount);
try
for i:=0 to ThreadCount-1 do
begin
ProcessThread[i] := TProcessThread.Create;
end;
except
end;
end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
i: Integer;
begin
for i:=0 to ThreadCount-1 do
begin
ProcessThread[i].State := False;
end;
end;

end.

[/code]
jim1247
一般會員


發表:8
回覆:20
積分:5
註冊:2003-01-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-30 01:02:28 IP:220.132.xxx.xxx 未訂閱
因為需求要在Thread裡不斷的偵測某變數, 並依變數來執行不同的程式碼, 所以Thread不能只執行一次就停止
原本此部份是寫在Application的Idle裡, 但現在要改成多個線程同時執行
我希望能像Idle一樣執行期間, 不會將資源佔盡, 而可以做其他的事

至於為什麼要這樣做, 是因為之前架構是由Idle來跑, 我想不出有什麼可以取代Idle又能多線程的, 請指教


===================引 用 syntax 文 章===================
反問你一個問題

如果當下只有你的 Thread 在執行,你希望他只用 10% 的 CPU ,然後用 10 倍的時間才完成你的工作嗎?
還是由系統幫他安排適當的 Time Frame,然後儘速完成工作?

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-01-31 09:36:35 IP:61.64.xxx.xxx 訂閱
天下間有不佔資源的程式嗎?

請你教我,我超想學,這樣以後 CPU 都 100% Free

===================引 用 jim1247 文 章===================
因為需求要在Thread裡不斷的偵測某變數, 並依變數來執行不同的程式碼, 所以Thread不能只執行一次就停止
原本此部份是寫在Application的Idle裡, 但現在要改成多個線程同時執行
我希望能像Idle一樣執行期間, 不會將資源佔盡, 而可以做其他的事

至於為什麼要這樣做, 是因為之前架構是由Idle來跑, 我想不出有什麼可以取代Idle又能多線程的, 請指教


===================引 用 syntax 文 章===================
反問你一個問題

如果當下只有你的 Thread 在執行,你希望他只用 10% 的 CPU ,然後用 10 倍的時間才完成你的工作嗎?
還是由系統幫他安排適當的 Time Frame,然後儘速完成工作?
jim1247
一般會員


發表:8
回覆:20
積分:5
註冊:2003-01-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-01-31 15:04:51 IP:61.222.xxx.xxx 未訂閱
我不懂你是故意這樣說的嗎? 我是說不將資源佔盡, 沒說不佔資源啊
以我之前寫的code, 只要run起來完全不能動, 雖然程式在跑, 但因為CPU被衝到100%, 那我其他事都不用做了
我連切換到windows桌面這種事都會卡住, 所以才請教有沒別的方法, 也許是我表達能力不好
之前用Idle在執行該程式碼時, 並不會有整個卡住的情形, 而Idle只要App不結束, 會一直重覆執行
但Thread並無法自己不斷重覆執行, 除非你又再execute一次, 而我用while的方式會整個卡住
不知道你清楚我在說什麼嗎?

目前我改回用Idle的方式去處理100個Object, 並各自執行自己的procedure, 不會再有整個卡住的情形
但依然想知道之前的方法是否可行


===================引 用 syntax 文 章===================
天下間有不佔資源的程式嗎?

請你教我,我超想學,這樣以後 CPU 都 100% Free

===================引 用 jim1247 文 章===================
因為需求要在Thread裡不斷的偵測某變數, 並依變數來執行不同的程式碼, 所以Thread不能只執行一次就停止
原本此部份是寫在Application的Idle裡, 但現在要改成多個線程同時執行
我希望能像Idle一樣執行期間, 不會將資源佔盡, 而可以做其他的事

至於為什麼要這樣做, 是因為之前架構是由Idle來跑, 我想不出有什麼可以取代Idle又能多線程的, 請指教


===================引 用 syntax 文 章===================
反問你一個問題

如果當下只有你的 Thread 在執行,你希望他只用 10% 的 CPU ,然後用 10 倍的時間才完成你的工作嗎?
還是由系統幫他安排適當的 Time Frame,然後儘速完成工作?
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-01-31 18:01:11 IP:61.64.xxx.xxx 訂閱
啊哈!被抓包了
我確實是故意這樣說的!

我也很想跟你解釋,但不容易辦到,因為看來你的基本知識還不夠完備

這樣要解釋起來,沒有 800 字以上說不清,我只能說抱歉了,你可能要自己看書
不過可以提供你幾個方向

1. 作業系統原理 --> 去瞭解一下 Time Sharing System 意義與運作方式
2. 如何寫好程式、如何做好的程式設計,之類的書,你的程式設計思維,恩,需要訓練
3. Thread 如何使用
4. 什麼是 Program Pirority,去瞭解一下吧!

因為,程式在使用時,50%,不算什麼,除非你的能力很差,不然,那 50 % 是真的有在做事情

至於在 App 的主迴圈內做事,並不是個好主意,但也不無不可,只是你自己要清楚作了什麼、影響、與後果

最後 Thread 你不會用,這是我的看法,不然 Thread 就可以解決你的需求了
因為依據你第一次的程式
1.「直到我按下Button後才Suspend」,該程式的作法,是「結束」,不是「Suspend」,Suspend 有 Suspend 的方式
2. 100 個 Thread ? 你是作什麼超大型的程式嗎?如果不是,表示你的程式設計能力很有問題喔!
3. 「偵測變數」,的確不需要消多少 CPU 時間,但是,你說歸說,沒看到你實際的程式碼,所以不知道狀況到底有多糟糕

如果你問的問題,可以在 800 字內說請處講明白,我會跟你解釋的,但我的打字很慢,請原諒我懶!

===================引 用 jim1247 文 章===================
我不懂你是故意這樣說的嗎? 我是說不將資源佔盡, 沒說不佔資源啊
以我之前寫的code, 只要run起來完全不能動, 雖然程式在跑, 但因為CPU被衝到100%, 那我其他事都不用做了
我連切換到windows桌面這種事都會卡住, 所以才請教有沒別的方法, 也許是我表達能力不好
之前用Idle在執行該程式碼時, 並不會有整個卡住的情形, 而Idle只要App不結束, 會一直重覆執行
但Thread並無法自己不斷重覆執行, 除非你又再execute一次, 而我用while的方式會整個卡住
不知道你清楚我在說什麼嗎?

目前我改回用Idle的方式去處理100個Object, 並各自執行自己的procedure, 不會再有整個卡住的情形
但依然想知道之前的方法是否可行


===================引 用 syntax 文 章===================
天下間有不佔資源的程式嗎?

請你教我,我超想學,這樣以後 CPU 都 100% Free

===================引 用 jim1247 文 章===================
因為需求要在Thread裡不斷的偵測某變數, 並依變數來執行不同的程式碼, 所以Thread不能只執行一次就停止
原本此部份是寫在Application的Idle裡, 但現在要改成多個線程同時執行
我希望能像Idle一樣執行期間, 不會將資源佔盡, 而可以做其他的事

至於為什麼要這樣做, 是因為之前架構是由Idle來跑, 我想不出有什麼可以取代Idle又能多線程的, 請指教


===================引 用 syntax 文 章===================
反問你一個問題

如果當下只有你的 Thread 在執行,你希望他只用 10% 的 CPU ,然後用 10 倍的時間才完成你的工作嗎?
還是由系統幫他安排適當的 Time Frame,然後儘速完成工作?
jim1247
一般會員


發表:8
回覆:20
積分:5
註冊:2003-01-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-01-31 18:45:27 IP:61.222.xxx.xxx 未訂閱
1.的確, 一開始的程式按下按鈕是結束, suspend是暫停, 因為code是我臨時改寫的, 實際在跑的沒這麼簡單
2.為什麼要有100個thread, 其實是我在寫一個壓測程式, 必須要同時執行100個(或以上)的client
但我沒有100台電腦可以試, 所以想寫成1隻AP裡同時跑n個線程來模擬n個client
3.變數問題只是在Idle中, 每個階段都會改變, 並執行相關程式碼而已

也許就像你說的, 在thread的主迴圈中做事不是個好主意, 你說的那些原理我會再去瞭解一下, 感謝回覆

===================引 用 syntax 文 章===================
啊哈!被抓包了
我確實是故意這樣說的!

我也很想跟你解釋,但不容易辦到,因為看來你的基本知識還不夠完備

這樣要解釋起來,沒有 800 字以上說不清,我只能說抱歉了,你可能要自己看書
不過可以提供你幾個方向

1. 作業系統原理 --> 去瞭解一下 Time Sharing System 意義與運作方式
2. 如何寫好程式、如何做好的程式設計,之類的書,你的程式設計思維,恩,需要訓練
3. Thread 如何使用
4. 什麼是 Program Pirority,去瞭解一下吧!

因為,程式在使用時,50%,不算什麼,除非你的能力很差,不然,那 50 % 是真的有在做事情

至於在 App 的主迴圈內做事,並不是個好主意,但也不無不可,只是你自己要清楚作了什麼、影響、與後果

最後 Thread 你不會用,這是我的看法,不然 Thread 就可以解決你的需求了
因為依據你第一次的程式
1.「直到我按下Button後才Suspend」,該程式的作法,是「結束」,不是「Suspend」,Suspend 有 Suspend 的方式
2. 100 個 Thread ? 你是作什麼超大型的程式嗎?如果不是,表示你的程式設計能力很有問題喔!
3. 「偵測變數」,的確不需要消多少 CPU 時間,但是,你說歸說,沒看到你實際的程式碼,所以不知道狀況到底有多糟糕

如果你問的問題,可以在 800 字內說請處講明白,我會跟你解釋的,但我的打字很慢,請原諒我懶!

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-02-01 15:37:59 IP:61.64.xxx.xxx 訂閱
我說的是 App. 的主迴圈,可不是 Thread 的喔!
你只要用 Thread 即可,其實 OS 會幫你掌控,各 Thread 需要的時間與消耗的資源,如果你嫌使用過多 CPU ,那你要檢討的是你 Thread 內的程式碼效率,如果你還是嫌慢,那把 Thread 的 Pirority 設到最低,但相對完成會很慢

===================引 用 jim1247 文 章===================
1.的確, 一開始的程式按下按鈕是結束, suspend是暫停, 因為code是我臨時改寫的, 實際在跑的沒這麼簡單
2.為什麼要有100個thread, 其實是我在寫一個壓測程式, 必須要同時執行100個(或以上)的client
但我沒有100台電腦可以試, 所以想寫成1隻AP裡同時跑n個線程來模擬n個client
3.變數問題只是在Idle中, 每個階段都會改變, 並執行相關程式碼而已

也許就像你說的, 在thread的主迴圈中做事不是個好主意, 你說的那些原理我會再去瞭解一下, 感謝回覆

===================引 用 syntax 文 章===================
啊哈!被抓包了
我確實是故意這樣說的!

我也很想跟你解釋,但不容易辦到,因為看來你的基本知識還不夠完備

這樣要解釋起來,沒有 800 字以上說不清,我只能說抱歉了,你可能要自己看書
不過可以提供你幾個方向

1. 作業系統原理 --> 去瞭解一下 Time Sharing System 意義與運作方式
2. 如何寫好程式、如何做好的程式設計,之類的書,你的程式設計思維,恩,需要訓練
3. Thread 如何使用
4. 什麼是 Program Pirority,去瞭解一下吧!

因為,程式在使用時,50%,不算什麼,除非你的能力很差,不然,那 50 % 是真的有在做事情

至於在 App 的主迴圈內做事,並不是個好主意,但也不無不可,只是你自己要清楚作了什麼、影響、與後果

最後 Thread 你不會用,這是我的看法,不然 Thread 就可以解決你的需求了
因為依據你第一次的程式
1.「直到我按下Button後才Suspend」,該程式的作法,是「結束」,不是「Suspend」,Suspend 有 Suspend 的方式
2. 100 個 Thread ? 你是作什麼超大型的程式嗎?如果不是,表示你的程式設計能力很有問題喔!
3. 「偵測變數」,的確不需要消多少 CPU 時間,但是,你說歸說,沒看到你實際的程式碼,所以不知道狀況到底有多糟糕

如果你問的問題,可以在 800 字內說請處講明白,我會跟你解釋的,但我的打字很慢,請原諒我懶!
SmallBare
一般會員


發表:2
回覆:11
積分:2
註冊:2003-10-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-04-14 01:52:04 IP:61.219.xxx.xxx 訂閱
在Thread內加
TEvent----->TEvent.WaitFor或使用Sleep可以暫時釋放程式控制權
試試看

Var
Event:TEvent;
=========================
TForm1.Creat;
Event:=TEvent.Creat;
=========================
TForm1.Destroy;

Thread.Terminate;
Thread.WaitFor;
Event.Free;
=========================
Thread.Execute;
While (Not Terminated) Do Begin
..................
Event.WaitFor(1); 不要設0, 0是完全不等,跟沒作用一樣

Sleep(1);
End;
系統時間:2024-05-06 15:12:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!