關於Thread效能問題 |
答題得分者是:syntax
|
jim1247
一般會員 發表:8 回覆:20 積分:5 註冊:2003-01-30 發送簡訊給我 |
當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 發送簡訊給我 |
反問你一個問題
如果當下只有你的 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 發送簡訊給我 |
因為需求要在Thread裡不斷的偵測某變數, 並依變數來執行不同的程式碼, 所以Thread不能只執行一次就停止
原本此部份是寫在Application的Idle裡, 但現在要改成多個線程同時執行 我希望能像Idle一樣執行期間, 不會將資源佔盡, 而可以做其他的事 至於為什麼要這樣做, 是因為之前架構是由Idle來跑, 我想不出有什麼可以取代Idle又能多線程的, 請指教 ===================引 用 syntax 文 章=================== 反問你一個問題 如果當下只有你的 Thread 在執行,你希望他只用 10% 的 CPU ,然後用 10 倍的時間才完成你的工作嗎? 還是由系統幫他安排適當的 Time Frame,然後儘速完成工作? |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
天下間有不佔資源的程式嗎?
請你教我,我超想學,這樣以後 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 發送簡訊給我 |
我不懂你是故意這樣說的嗎? 我是說不將資源佔盡, 沒說不佔資源啊
以我之前寫的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 發送簡訊給我 |
啊哈!被抓包了
我確實是故意這樣說的! 我也很想跟你解釋,但不容易辦到,因為看來你的基本知識還不夠完備 這樣要解釋起來,沒有 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 發送簡訊給我 |
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 發送簡訊給我 |
我說的是 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 發送簡訊給我 |
在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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |