如何知道 Thread 已經完完整整的暫停住 |
尚未結案
|
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: While(1) { RUN(); } 當Thread Excute 中含上述程式 因為處理RUN函式需要一點時間 每當暫停(Suspend)住Thread時 卻不會馬上停止.會直到RUN函式執行完畢才停止 要如何知道Thread 已經完完全全的暫停住了呢? 還請前輩指導.... >>< face="Verdana, Arial, Helvetica"> ray24 你好: 你可以在 thread 的 function 裡面,對某個 VCL 元件的顯示做變更 就可以驗證 thread 是否真的已經暫停了,例如: < class="code"> int i=0; // ............................ Label1->Caption=IntToStr(i ); 備註: 或者~~也可以利用這種方式知道 if(thread->Suspended) -- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2003/03/07 00:24:49
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
以下是 Thread VCL 的原始碼片斷
procedure TThread.SetSuspended(Value: Boolean); begin if Value <> FSuspended then if Value then Suspend else Resume; end; procedure TThread.Suspend; begin FSuspended := True; SuspendThread(FHandle); end;由以上原始碼看來,您無法經由 Suspend() 或 Suspended=true 將 Thread 立刻停下,同樣您也無法經由 Suspended 這個值來判斷是否真的完完全全暫停了,因為您可以看到 Suspend() 是先將旗標設 true 才叫用 API 暫停 Thread 的,而 Thread 如何暫停是由系統安排,您無法得知。 如果在你的 RUN() 中有 LOOP ,可以先判斷 Suspended 是否為 true(因為 Suspend() 會先將 Suspended 設為 true,可方便您判斷),若是則 Application->ProcessMessages() 一下,讓系統有空將你的 Thread 停下。 如果想要確定真的完完全全暫停,那可能要在 RUN() 的 LOOP 內加入 Counter ,每次 LOOP 加 1,這個 Counter 可由外部存取,當 Suspended 後,一段時間內如果該 Counter 的值不變,就表示已 Suspended 了。 當然您的 LOOP 必需保證不會卡死,否則,此法無效。 沒空更新的網頁... http://coolsite.to/dllee C及指標教學,計算機概論,資訊管理導論... http://home.kimo.com.tw/dllee.tw http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
|
wj77
一般會員 發表:0 回覆:9 積分:6 註冊:2003-02-17 發送簡訊給我 |
|
jazz
初階會員 發表:10 回覆:43 積分:35 註冊:2002-06-15 發送簡訊給我 |
|
ray24
中階會員 發表:18 回覆:88 積分:56 註冊:2002-07-24 發送簡訊給我 |
|
wj77
一般會員 發表:0 回覆:9 積分:6 註冊:2003-02-17 發送簡訊給我 |
引言: 啊....失敗的實驗還是沒用 真對不起 > ---------------------- 台上一分鐘,台下十年功 >>< face="Verdana, Arial, Helvetica"> 若有多個thread同時存取一個global object or variable時 很容易造成一些問題, 如你說的va 下列二個object可避免上述的情形發生 TMultiReadExclusiveWriteSynchronizer TCriticalSection 基本上,這二個的用法差不多 只要把它的instance宣告成global 然後在thread要存取你的global variable前 call MultiReadExclusiveWriteSynchronizer::BeginRead() or MultiReadExclusiveWriteSynchronizer::BeginWrite() or TCriticalSection::Enter() 把global variable lock, 等存取動作結束後, 再call當對的method unlock即可 詳細情形請參考BCB的help... 希望對你有幫助 ^^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |