有兩個對象實例,我應該從兩個併發線程,從VCL線程和工作線程訪問。從併發線程訪問相同的對象
TSlave = class
...
public
...
statusByte: byte;
...
end;
TMaster = class
private
FSlaves: TList;
FrBuffer: array of byte;
...
public
CMD_GET_SLAVE(aSlave: TSlave);
...
end;
procedure TMaster.CMD_GET_SLAVE(aSlave: TSlave);
begin
...
rBuffer := udpsend(); //calling a function that sends udp packet and returns the answer
aSlave.statusByte := rBuffer[2];
...
end;
我從對象的引用存儲在VCL TTreeNodes的「數據」領域 - treenode.data(我還可以存儲他們在一個TMaster私人列表)。
有用於訪問所述從屬對象(寫入slave.statusByte)和TMaster例如兩個「選項」的樹節點>>
點擊(如我通過TMaster實例訪問從屬對象) 。當發生這種情況時,我發送一個調用master.CMD_GET_SLAVE的UDP數據包,在這種方法中,我從FrBuffer讀取答案並寫入slave.statusByte。
有一個工作線程循環地執行相同的操作(調用master.CMD_GET_SLAVE)。這種情況下,我不從treenode.data獲取slave實例,而是從master的TList對象(FSlaves)中獲取。
問題是,如何正確管理它?因爲當用戶點擊treenode時可能會出現這種情況,同時可能會有來自線程的傳入訪問。
我不接觸工作線程的任何VCL控件,'只是'從兩個併發線程訪問相同的對象。我應該做同步同步主同步線程(因爲刷新一些可視化的VCL控制)時,我做同樣的同步?
謝謝。你告訴訪問相同的對象/字段在這裏不是問題。那是因爲我沒有從'statusByte'上的線程做任何計算,只是寫它,所以它的'原子'? 關於udpsend,以及我想只是爲了TIdUDPClient的另一個實例,但那是浪費資源。你提到的隊列,在實踐中看到類似的東西會很高興。 – grinner