全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7487
推到 Plurk!
推到 Facebook!

Thread + Queue 的範例 -- 不看可惜,可以學到不少的額外技巧!!

 
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-09-13 10:54:31 IP:61.229.xxx.xxx 訂閱


大家好,因為前些天看了一位網友有需要這樣的功能就隨性寫了一下。程式雖然小,但架構很全! 很適用初級與進階的朋友。裡面也用了一些cpp較少用的技巧,如 friend,function pointer…

希望大家指教,若有程式上不了解的,或是需要修正的,也請發問! 放在這討論區而沒放入作品區就是為了可以進一步的互相討論,這算是個範例,不能算是個成品吧!

小作品,應該很多不足的地方,還請見諒!

建議操作實驗:
1/ push 一些item,然後等thread跑完,觀查一下,thread應該是停住沒cost 資源的
2/ 當thread 在跑的時候,邊push一些item,看工作的情形
3/ pause thread 在 resume,讓thread繼續工作
4/ 把thread stop,看工作是否停下來

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/
生有涯,知無涯

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
附加檔案:ThreadQue.rar
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-09-13 12:20:24 IP:61.229.xxx.xxx 訂閱
忘了在OnDestroy的事件上加

mWorker->Terminate();

請自補一下,sorry。雖然thread最後還是會被系統強制停了,但為不好的寫作風格!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-13 21:21:58 IP:219.68.xxx.xxx 未訂閱

這位前輩你好,

我在compile的時候出現了這個錯誤訊息

[Linker Fatal Error] Fatal: Unable to open file 'TNTLIBR.LIB'

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-09-13 21:52:48 IP:61.229.xxx.xxx 訂閱
那是TNT元件,不過我的project中沒使用到,你可以在IDE環境下

Project->Edit Option Source

然後會出現一個xml的檔,你在檔中找 TNTLIBR.LIB ,應該有二個,把這二個值刪了,然後存檔(Save All)。再compile。若有發現類似找不到的,用同樣的方法。

===================引 用 文 章===================

這位前輩你好,

我在compile的時候出現了這個錯誤訊息

[Linker Fatal Error] Fatal: Unable to open file 'TNTLIBR.LIB'

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-14 17:06:56 IP:220.130.xxx.xxx 未訂閱

前輩你好

我刪除了之後, 一樣出現那行訊息, 去看xml檔已經沒有那個字眼了

關閉再開, 之前刪除的那兩個名稱, 又出現了

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-09-14 23:49:28 IP:61.229.xxx.xxx 訂閱

請改下載下面的看看。我改成dynamic link package

http://delphi.ktop.com.tw/download.html?download=upload/ThreadQue2.rar

之於xml裡的資料會再出現? 或者你用notepad之類的在不開ide的情形下去改,會再出現嗎? 不過無論如何,若不行則下載上面新的!

謝謝


===================引 用 文 章===================

前輩你好

我刪除了之後, 一樣出現那行訊息, 去看xml檔已經沒有那個字眼了

關閉再開, 之前刪除的那兩個名稱, 又出現了

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-09-16 14:32:07 IP:219.68.xxx.xxx 未訂閱

前輩你好

這一版是ok的, 不過要將 build with runtime package取消打勾才行

不然會出現另一個錯誤訊息,

有一個問題再請教一下

我依照您的方式去做了之後, 我的程式裡, 都要按兩次start才可以resume()成功

會是哪裡的問題呢?


===================引 用 文 章===================

請改下載下面的看看。我改成dynamic link package

http://delphi.ktop.com.tw/download.html?download=upload/ThreadQue2.rar

之於xml裡的資料會再出現? 或者你用notepad之類的在不開ide的情形下去改,會再出現嗎? 不過無論如何,若不行則下載上面新的!

謝謝


===================引 用 文 章===================

前輩你好

我刪除了之後, 一樣出現那行訊息, 去看xml檔已經沒有那個字眼了

關閉再開, 之前刪除的那兩個名稱, 又出現了

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-09-16 18:20:13 IP:61.229.xxx.xxx 訂閱
我附的程式是否也要二次呢? 或是你修改後的程式才需要二次?
若是你修改後的需要二次,那可以請你把關於Push Work這部份的程式還有 mWorker->Resume(); 的那段function貼出來? 還有,一開始的時候 new的時候
mWorker = new Worker(true); 確定有用true嗎? 還是你用了False?


===================引 用 文 章===================

我依照您的方式去做了之後, 我的程式裡, 都要按兩次start才可以resume()成功

會是哪裡的問題呢?

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2006-09-16 20:19:12 IP:219.68.xxx.xxx 未訂閱

你的程式完全ok

我自己也試著做了一個單純的例子, 也是ok的,

可是把一樣的東西掛到我原本的程式中之後,

卻發生要按兩次, 或著多次才會進行resume(), 這我就覺得好奇怪了


===================引 用 文 章===================
我附的程式是否也要二次呢? 或是你修改後的程式才需要二次?
若是你修改後的需要二次,那可以請你把關於Push Work這部份的程式還有 mWorker->Resume(); 的那段function貼出來? 還有,一開始的時候 new的時候
mWorker = new Worker(true); 確定有用true嗎? 還是你用了False?

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2006-09-16 20:43:23 IP:61.229.xxx.xxx 訂閱
請注意一件事: 若是 suspend( )被按了(執行了) n 次,那麼resume也要被執行n次才會整個thread再度活起來,你可以把我的程式的button disable的部份全都先mark 起來,然後pause 連按3次,這時候你去按resume一次,二次都會不有反應,直到三次才開始又動。

是否有可能你的程式,或是你不小心,連pause了幾次呢? 用中斷的方式追程式一下看看,或者在pause指令的後面加個MessageBeep( );然後仔細的聽嗶嗶幾聲。切記不要使用ShowMessage。在thread中使用這個方法可能會當。


===================引 用 文 章===================

你的程式完全ok

我自己也試著做了一個單純的例子, 也是ok的,

可是把一樣的東西掛到我原本的程式中之後,

卻發生要按兩次, 或著多次才會進行resume(), 這我就覺得好奇怪了


===================引 用 文 章===================
我附的程式是否也要二次呢? 或是你修改後的程式才需要二次?
若是你修改後的需要二次,那可以請你把關於Push Work這部份的程式還有 mWorker->Resume(); 的那段function貼出來? 還有,一開始的時候 new的時候
mWorker = new Worker(true); 確定有用true嗎? 還是你用了False?

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Solaris2005
一般會員


發表:7
回覆:13
積分:4
註冊:2003-05-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2006-09-16 20:48:13 IP:219.68.xxx.xxx 未訂閱

前輩, 你太神啦~

我去追蹤了一下, 果然在程式執行之前

有一行已經先做了pause的動作 !

這就是問題的所在了 !

太神啦~~~~

多謝多謝 ! 我的程式已經可以正常run了, 感謝 !
===================引 用 文 章===================
請注意一件事: 若是 suspend( )被按了(執行了) n 次,那麼resume也要被執行n次才會整個thread再度活起來,你可以把我的程式的button disable的部份全都先mark 起來,然後pause 連按3次,這時候你去按resume一次,二次都會不有反應,直到三次才開始又動。

是否有可能你的程式,或是你不小心,連pause了幾次呢? 用中斷的方式追程式一下看看,或者在pause指令的後面加個MessageBeep( );然後仔細的聽嗶嗶幾聲。切記不要使用ShowMessage。在thread中使用這個方法可能會當。

z858328y
一般會員


發表:7
回覆:9
積分:3
註冊:2006-08-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2006-10-11 22:47:46 IP:61.228.xxx.xxx 未訂閱
大大,我也想學,可是我沒辦法下載程式碼,可以教一下怎麼下載嗎???
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2006-10-12 11:54:21 IP:61.229.xxx.xxx 訂閱

你好,因為最近ktop還在改版,所以過去的一些連結有些問題;

請改下面的網址來下載:

http://delphi.ktop.com.tw/download.php?download=upload/ThreadQue2.rar

若你有compiler上的問題,請先看上面的一些問題排除,若還有問題,可留言或寫信給我!

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/
生有涯而知無涯,以有涯隨無涯,殆矣

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
johnlp
一般會員


發表:2
回覆:13
積分:8
註冊:2004-10-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-01-14 01:44:24 IP:59.120.xxx.xxx 訂閱
aftcast你好,有個問題想請教

在WorkerThread.cpp中
void __fastcall Worker::Execute()
{
...
item.mpFunction(item); //run user define function

...
Synchronize(UpdateMemo);
...
}

}

標記的這兩行所執行的function如下:

void fun1(const WORK_ITEM &item)
{
String s = String().sprintf("%s Num=%d from FUN_1",item.mNameParam,item.mNo);
for (int i=0; i < 100000000; i); // just emulate some further process
MainForm->Memo1->Lines->Add(s);
}

void __fastcall Worker::UpdateMemo(void)
{
MainForm->Memo2->Lines->Delete(0); // delete first item from memo2
}

我的問題是...上述兩個function中都有牽涉到vcl元件的操作(如上標記處)
為什麼後者使用Synchronize , 前者卻不使用 , 有什麼特別的用意嗎?
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-01-14 12:27:27 IP:60.248.xxx.xxx 訂閱
BCB 封裝Thread的手法與觀念非常高竿,Thread在許多地方都有非常大的用途,綜觀Thread相關知識不外乎"同步".
使用BCB所提供的TThread是好事,但如果不明白TThread的動作原理,那在許多地方會造成無法理解的現象產生.如Message Queu(UI)不動作等.
又對Application Form 送出WM_NULL又會發生何事???
大大是否有興趣要講解一下.
系統時間:2024-05-03 22:39:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!