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

關於Muit-Thread觀念

尚未結案
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-11-16 15:00:14 IP:211.72.xxx.xxx 訂閱
有個觀念問題想請各位大大幫忙,我有個測試機台搭配一個程式來進行產品測試,程式內容是主程式搭配10個不同計算功能的副程式來使用,而我的問題是:

1.我需要編寫一的程式,再同一台電腦上可同時架設多台測台來測試產品,請問muit-thread的部分應該怎麼架構比較好呢?

2.假如我有2個以上的thread,我需要用到chart VCL元件顯示波形,每個Thread分別都有自己的chart來使用,這樣還需要用Synchronize()防止嗎?

3.假設不同的thread即使有個別的VCL元件一樣需要用Synchronize()來防止,但是我爬文得知用Synchronize()等於排隊執行,這樣無法達到同時效果,請問有什麼方式可以替代嗎?
------
lee
jesson
一般會員


發表:11
回覆:16
積分:5
註冊:2002-04-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-04-10 01:10:09 IP:111.184.xxx.xxx 訂閱

===================引 用 small7011 文 章===================
有個觀念問題想請各位大大幫忙,我有個測試機台搭配一個程式來進行產品測試,程式內容是主程式搭配10個不同計算功能的副程式來使用,而我的問題是:

1.我需要編寫一的程式,再同一台電腦上可同時架設多台測台來測試產品,請問muit-thread的部分應該怎麼架構比較好呢?

1.個人認為:視其測試電腦的效能為何,再考量到底要開幾個 Thread,以讓電腦CPU不要用得太滿為原則,因為開多個 Thread 測試效率不見得更好。

2.假如我有2個以上的thread,我需要用到chart VCL元件顯示波形,每個Thread分別都有自己的chart來使用,這樣還需要用Synchronize()防止嗎?

2.個人認為:TChart 那是VCL的元件,目的是用來 Display 用,但你要測試的是產品運算效率,因 VCL 元件不支援 Safe-Thread 所以需用到 Synchronize() 同步化來做資源保護的動作,像是TCriticalSection的模式運行;因此個人建議分成兩件事處裡,第一:產品測試運算這部分走Multi-Thread,但切記喔各個Thread的參數不可有共用的情況喔;第二:至於TChart顯示的部分,你可以用多個 TTimer 每單位時間 Update 多個 TChart Display 一次。

3.假設不同的thread即使有個別的VCL元件一樣需要用Synchronize()來防止,但是我爬文得知用Synchronize()等於排隊執行,這樣無法達到同時效果,請問有什麼方式可以替代嗎?

3.第2點已回覆
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-04-11 18:21:33 IP:211.20.xxx.xxx 訂閱
1.等待許久終於有人回答,真的很感謝jesson大的答覆,這是我第一次用thread有許多地方都不懂,目前專案大致上都ok,VCL元件與有可能搶資源地方我也都用Synchronize()來處理,
雖然有些地方我還是沒有搞懂,但還是很謝謝你的答覆.
===================引 用 jesson 文 章===================

===================引 用 small7011 文 章===================
有個觀念問題想請各位大大幫忙,我有個測試機台搭配一個程式來進行產品測試,程式內容是主程式搭配10個不同計算功能的副程式來使用,而我的問題是:

1.我需要編寫一的程式,再同一台電腦上可同時架設多台測台來測試產品,請問muit-thread的部分應該怎麼架構比較好呢?

1.個人認為:視其測試電腦的效能為何,再考量到底要開幾個 Thread,以讓電腦CPU不要用得太滿為原則,因為開多個 Thread 測試效率不見得更好。

2.假如我有2個以上的thread,我需要用到chart VCL元件顯示波形,每個Thread分別都有自己的chart來使用,這樣還需要用Synchronize()防止嗎?

2.個人認為:TChart 那是VCL的元件,目的是用來 Display 用,但你要測試的是產品運算效率,因 VCL 元件不支援 Safe-Thread 所以需用到 Synchronize() 同步化來做資源保護的動作,像是TCriticalSection的模式運行;因此個人建議分成兩件事處裡,第一:產品測試運算這部分走Multi-Thread,但切記喔各個Thread的參數不可有共用的情況喔;第二:至於TChart顯示的部分,你可以用多個 TTimer 每單位時間 Update 多個 TChart Display 一次。

3.假設不同的thread即使有個別的VCL元件一樣需要用Synchronize()來防止,但是我爬文得知用Synchronize()等於排隊執行,這樣無法達到同時效果,請問有什麼方式可以替代嗎?

3.第2點已回覆
------
lee
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-04-21 10:48:33 IP:210.64.xxx.xxx 訂閱
理論上n個thread對n個物件是相對比較安全,因為每個物件的data  members是各自的。相對一個物件對n>1的thread時,因data  members僅一個實例(instance),所以同時間使用方法進而改變了資料時,就馬上出問題。然而,是否n對n 就安全無疑?  也不一定,還要考慮是否某方法是否有用到全域的變數,若有,n對n也是無法解決共用了全域的共享問題。詳請請參照我部落格上的關於thread安全的文 章。

即使有個別的vcl元件還需要用synchroize嗎? 當然不一定,問題在於它是否有用到全域的變數 (許多vcl都有用全域,在classes.pas裡定義不少),比如TADO的元件就不用synchroize (n對n時)。

synchronize的確是效能差,所以如果可以的話,可以改用TCriticalSection來取代,比如TMemo的Lines.Add前加入這個防止,這個目前我測應該沒問題。當然,有些元件本身就是「一定要synchronize」,你若問我哪些? 我也不能明確的確認。又如bmp,jpg等畫圖的,可以在畫前使用TCanvas.Lock方式。

此外,n對n 的物件創建也是偏"理想化",若是可視元件,一般是不能在子thread中new出來,除非用特殊技巧,讓thread變成ui thread,這太深了,先忘了它。 不過「不可視的」就可以高興一點new看看。

我的blog有二篇,可以參考一下!

===================引 用 small7011 文 章===================
2.假如我有2個以上的thread,我需要用到chart VCL元件顯示波形,每個Thread分別都有自己的chart來使用,這樣還需要用Synchronize()防止嗎?

3.假設不同的thread即使有個別的VCL元件一樣需要用Synchronize()來防止,但是我爬文得知用Synchronize()等於排隊執行,這樣無法達到同時效果,請問有什麼方式可以替代嗎?


------



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

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