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

Multithread的範例

 
aftcast
站務副站長


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-07-22 15:04:04 IP:210.64.xxx.xxx 訂閱
分享給所有沒時間來聽2011年QCOM舉辨Multithread講座的朋友!

請至qcom捷康的網站下載,網址如下: 請搭配講義看比較能了解用意喔! (左下角會有標 ex 字表有例子)

qcomgroup.com.tw/embarcadero/press_and_event.htm

對於範例有疑問者,歡迎和我討論與指教! : )

謝謝大家!

蕭沖
------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2011-07-22 02:23:11, 註解 無‧
boss.tw
高階會員


發表:15
回覆:109
積分:194
註冊:2005-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-07-22 22:45:48 IP:122.116.xxx.xxx 訂閱
很棒的技術講座唷
小弟剛好有這榮幸親耳聽到
感謝分享~
aftcast
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-07-24 22:32:56 IP:122.126.xxx.xxx 訂閱
謝謝你的支持喔!

下回有機會的話,報一下你的大名讓我認識一下吧… 這回講座應該有一些ktop的會員,但都沒來相認一下…我覺得很可惜。希望可以與大家交個朋友,分享學習的經驗!



===================引 用 boss.tw 文 章===================
很棒的技術講座唷
小弟剛好有這榮幸親耳聽到
感謝分享~
------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-07-25 18:56:35 IP:118.169.xxx.xxx 未訂閱
還是低調一點好, 不過交個朋友, 不錯, 我也有出席, 雖然有一些我不是很清楚, 但有幾個key point, 卻解決了我多年的疑問, 真的是受益匪淺! 感謝!
===================引 用 aftcast 文 章===================
謝謝你的支持喔!

下回有機會的話,報一下你的大名讓我認識一下吧… 這回講座應該有一些ktop的會員,但都沒來相認一下…我覺得很可惜。希望可以與大家交個朋友,分享學習的經驗!



===================引 用 boss.tw 文 章===================
很棒的技術講座唷
小弟剛好有這榮幸親耳聽到
感謝分享~
aftcast
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-07-25 19:04:55 IP:210.64.xxx.xxx 訂閱
pd 大,等你很久了啦!  交朋友不用低調。我是想希望可以和你結識的呢!

: -)

To All :

delphi的範例我在改寫中,昨天寫了一小小部份。好幾個年沒寫delphi,真的有給它生疏了! 趕工中… 請稍後 … :p

------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-08-22 15:52:57 IP:219.87.xxx.xxx 訂閱
 aftcast大,希望你delphi的版本能快完成,不然看c 有點累哦,小弟還有觀念問題需再請大大講解,到時方便再麻煩大大了。

===================引 用 aftcast 文 章===================
pd 大,等你很久了啦! 交朋友不用低調。我是想希望可以和你結識的呢!

: -)

To All :

delphi的範例我在改寫中,昨天寫了一小小部份。好幾個年沒寫delphi,真的有給它生疏了! 趕工中… 請稍後 … :p

------
DELPHI初學者
lau.wang
一般會員


發表:0
回覆:2
積分:0
註冊:2011-12-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-01-12 21:03:14 IP:223.140.xxx.xxx 訂閱
蕭大俠:
真的很期待您的Delphi的範例。
因為有一個關於MultiThread的問題困擾我多年,在此想跟你請教一番!
1.在Thread中 call 系統提供的函數 (處理字串的函式:Copy, Format,... Math:Sin, Cos,.... ), 算不算 Thread-Safe?
2.在Thread call 自行寫的函數(例如計算CRC...一些比較耗時的), 算不算 Thread-Safe?會不會有重入的問題?
3.我有寫過一個程式, 使用TClientSocket , D6的環境, OnRead使用同一個事件會不會產生重入的問題?
Source Code如下: (這是透過TCP/IP去連結儀器,大約有30個以上)

[code delphi]
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=0 to COMPCount-1 do
//i:=17;
begin
COMX[i]:=TClientSocket.Create(Form1);
COMX[i].Host:=ip[i];
COMX[i].Port:=9925;
COMX[i].Tag:=i;
COMX[i].OnRead:=OnClientSocketRead;
end;
end;

procedure TForm1.OnClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
len:integer;
i:integer;
buff:pByte;
comm:TClientSocket;
ipx:string;
begin
comm:=TClientSocket(Sender);
len:=Socket.ReceiveLength;

GetMem(buff,len 1);
Socket.ReceiveBuf(RecvBuff,len) ;
Response(Sender,@RecvBuff[0],len ); //解析資料和存至資料庫

FreeMem(buff);

end;

[/code]


------
Delphi !!
aftcast
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-01-16 10:24:08 IP:122.126.xxx.xxx 訂閱
你好,

因近來忙於自己的新公司事務,所以時間不足,還請見諒!

1/ 使用系統提供的函式,還是有二種可能,不能夠100%確定是安全與否,以 FormatDateTime這個函式來說,它有提供二個版本(overload),其中一個是最後多一個參數叫FormatSettings,這個就是安全的,另一個則是不安全的。
2/ 自行寫的函式,或者是系統的函式,都是要考慮是否有使用全域變數,若有使用,則要看是否有使用criticalsection之類的機制,詳情就要看我的講義,裡面就是有提到關於判別的方式。
3/ 除非你的onread裡有使用到application->processmessage這類的函式,否則不會有重入的情形。因為TClientSocket是使用message event來觸發處理函式,即使你有n個socket,但都還是queue在訊息裡,逐一才會被執行。但若你使用了processmessage這種函式,會破壞queue的順序,如此就會重入。

Response(Sender,@RecvBuff[0],len ); //解析資料和存至資料庫
這行若是跑要花很長的時間(特別指對io很久,非cpu),只會有效率的問題。若在onread裡再起一thread來處理,則respnse的寫法就要合thread-safe。除非有很大的效率問題,且對thread很熟,否則目前的寫法就很好了!

ps: 若一切合thread-safe,那麼就不用考慮重入問題。重入問題是決定了是否要處理thread-safe,若是不會重入,當然就不需要處理。但,重入的問題不僅僅會發生在有thread的時時候,只能說多數發生在thread裡。比如上面我講的processmeaage也會有重入的問題。



------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2012-01-15 19:28:27, 註解 無‧
lau.wang
一般會員


發表:0
回覆:2
積分:0
註冊:2011-12-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-01-16 13:30:14 IP:210.240.xxx.xxx 訂閱
感謝蕭大俠在百忙之中還抽空回覆, 先祝您新公司生意興隆, 業績蒸蒸日上。

聽您這麼一解釋, 我完全了解,重入大都只會發生在Thread中,只要我的程式在OnRead中不要使用processmessage,
一切就還OK,......但如果我覺得在存入資料庫時發現會有拖慢系統時,才須把資料庫的程序改寫成 Thread,這時才來
考慮thread-safe的事。
最後一點是:關於 "使用系統提供的函式,還是有二種可能,不能夠100%確定是安全與否",此句的意思是要看Help怎麼寫囉!
是否有此情況的在Help都會寫出來嗎?
(PS: D6未提供 FormatDateTime overload, 所以只有一個版本。 D7才有,其他的版本未知。)


===================引 用 aftcast 文 章===================
你好,

因近來忙於自己的新公司事務,所以時間不足,還請見諒!

1/ 使用系統提供的函式,還是有二種可能,不能夠100%確定是安全與否,以 FormatDateTime這個函式來說,它有提供二個版本(overload),其中一個是最後多一個參數叫FormatSettings,這個就是安全的,另一個則是不安全的。
2/ 自行寫的函式,或者是系統的函式,都是要考慮是否有使用全域變數,若有使用,則要看是否有使用criticalsection之類的機制,詳情就要看我的講義,裡面就是有提到關於判別的方式。
3/ 除非你的onread裡有使用到application->processmessage這類的函式,否則不會有重入的情形。因為TClientSocket是使用message event來觸發處理函式,即使你有n個socket,但都還是queue在訊息裡,逐一才會被執行。但若你使用了processmessage這種函式,會破壞queue的順序,如此就會重入。

Response(Sender,@RecvBuff[0],len ); //解析資料和存至資料庫
這行若是跑要花很長的時間(特別指對io很久,非cpu),只會有效率的問題。若在onread裡再起一thread來處理,則respnse的寫法就要合thread-safe。除非有很大的效率問題,且對thread很熟,否則目前的寫法就很好了!

ps: 若一切合thread-safe,那麼就不用考慮重入問題。重入問題是決定了是否要處理thread-safe,若是不會重入,當然就不需要處理。但,重入的問題不僅僅會發生在有thread的時時候,只能說多數發生在thread裡。比如上面我講的processmeaage也會有重入的問題。



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