0

我創建一個線程如何訪問線程及其組件?

type 
    ss_thread = class; 

    ss_thread = class(TThread) 
    protected 
    Fff_id : string; 
    Fff_cmd : string; 
    Fff_host : string; 
    Fff_port : TIdPort; 
    procedure Execute; override; 
    public 
    constructor Create(const ff_id, ff_cmd: string; ff_host: string; ff_port: TIdPort); 
    end; 

constructor ss_thread.Create(const ff_id, ff_cmd: string; ff_host: string; ff_port: TIdPort); 
begin 
    inherited Create(False); 
    Fff_id := ff_id; 
    Fff_cmd := ff_cmd; 
    Fff_host := ff_host; 
    Fff_port := ff_port; 
end; 

... 
id := 123; 
... 

nst_ss_thread.Create(id, cmd, host, port); 

,並做一些對

procedure ss_thread.Execute; 
var 
    ws : TIdTCPClient; 
    data : TIdBytes; 
    i : integer; 
    list : TList; 
begin 
     ws := TIdTCPClient.Create(nil); 
     ws.Host := Fff_host; 
     ws.Port := Fff_port; 
.... 

如何訪問該線程 'WS' 變量通使用ID另一個線程:線程= 123?

謝謝

回答

3

它不能。

您已將ws聲明爲ss_thread.execute內的局部變量,這意味着它僅在此處可見。在ss_thread.execute之外無法看到,即使是ss_thread的其他部分。

如果您希望它從其他地方或線索可見,則需要將其移動到更可見的範圍。例如,如果您希望它從ss_thread中的其他位置可見,請將其移動到privateprotected部分中的界面聲明中,並且如果您希望它從外部可見ss_thread將其移至publishedpublic部分。

+0

......但更好地保持它的只讀屬性:-) –

+0

它太難理解了,怎麼做我的線程中有TIdTCPClient的列表?我做了什麼,我將它們全部存儲到TThreadList的創建中,但是如果線程銷燬它,我有訪問衝突,這就是爲什麼我詢問有關訪問線程的原因,也許一些示例會很好。 – waza123

+0

@ waza123:你的問題沒有提到有關TIdTCPClients的列表。它詢問如何訪問局部變量的範圍,這是Arioch'和我回答的範圍。如果您現在有不同的問題,請發佈一個新問題;在回答後不要改變這一個的全部含義。 –

2

你最好不要。線程對象正是爲了將其變量與其他線程隔離開來的。
否則所有類型的隨機非重複性的錯誤似乎 - http://en.wikipedia.org/wiki/Heisenbug

Parallel programming應該有非常明確的分離和絕緣。因爲你永遠無法預測執行的時間,以及哪個語句會在更早的時候運行,哪些會在稍後運行。

想象那麼簡單的場景:

ws := TIdTCPClient.Create(nil); 
    ws.Host := Fff_host; 
     // at this point another thread gets access to ws variable, 
     // as You demanded - and changes it, so WS gets another value! 
    ws.Port := Fff_port; 

你將如何檢測這樣的錯誤,如果它在重負荷下一個月只發生客戶多處理器計算機上的一次?在調試會話或模擬期間,您的工作站不會被複制!你將如何捕捉並修復?作爲一個經驗法則,當進行並行編程時,數據應該變成「共享不可變」和「私有可變」片斷,當進行線程間通信時,您應該 - 類似於進程間通信 - 使一些事件/消息隊列和pass commands and replies到/從線程,就像它在Windows GDI或MPI中完成一樣

然後,您的線程將從隊列中獲取「change ws variable」命令 - 在允許更改的適當時刻 - 並從裏面改變它。因此,您將採取控制措施,並確保變量僅在此時發生變化,並且不會影響代碼流。

我建議你閱讀OTL的例子,看看如何以更安全的方式完成線程間通信,直接訪問對象。 http://otl.17slon.com/tutorials.htm