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

如何知道 Thread 已經完完整整的暫停住

尚未結案
ray24
中階會員


發表:18
回覆:88
積分:56
註冊:2002-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-07 00:02:45 IP:218.32.xxx.xxx 未訂閱
While(1) {   RUN(); }    當Thread Excute 中含上述程式 因為處理RUN函式需要一點時間 每當暫停(Suspend)住Thread時 卻不會馬上停止.會直到RUN函式執行完畢才停止 要如何知道Thread 已經完完全全的暫停住了呢? 還請前輩指導.... ---------------------- 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-07 00:22:16 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-07 11:34:05 IP:61.231.xxx.xxx 未訂閱
以下是 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-07 14:55:47 IP:218.32.xxx.xxx 未訂閱
先感謝 RaynorPao 以及 dllee 大大的回應    暫停是由系統安排的...真糟糕 因為RUN()是對某一塊記憶體作處理 但這一塊記憶體的資料是全域的 所以在變更資料前必須讓Thread暫停才做修改的動作 否則會出現問題 譬如刪除某一些資料時則會出現VA(無效的存取) 更重要的是這些動作都必須是即時的 你們的建議我現在就去試看看...
------
台上一分鐘,台下十年功
wj77
一般會員


發表:0
回覆:9
積分:6
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-09 00:35:58 IP:61.224.xxx.xxx 未訂閱
如果你call Suspend()是為了要保護某個全域的記憶體區段 建議改用BeginRead(),EndRead()及BeginWrite(),EndWrite()試試
jazz
初階會員


發表:10
回覆:43
積分:35
註冊:2002-06-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-10 23:32:08 IP:61.30.xxx.xxx 未訂閱
利用 EnterCriticalSection 跟 LeaveCriticalSection 保護你的參數
ray24
中階會員


發表:18
回覆:88
積分:56
註冊:2002-07-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-18 13:13:23 IP:210.68.xxx.xxx 未訂閱
啊....失敗的實驗還是沒用 真對不起 > ---------------------- 台上一分鐘,台下十年功
------
台上一分鐘,台下十年功
wj77
一般會員


發表:0
回覆:9
積分:6
註冊:2003-02-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-21 23:57:22 IP:61.224.xxx.xxx 未訂閱
引言: 啊....失敗的實驗還是沒用 真對不起 > ---------------------- 台上一分鐘,台下十年功 < 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... 希望對你有幫助 ^^
系統時間:2024-04-28 5:39:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!