2009-11-25 30 views
2

我正在創建一個啓動線程的服務器(偵聽線程)。這個線程監聽連接並做它的事情。它最終可能會收到一些數據,我想傳遞給服務器的創建者:Delphi上的線程上下文

我的程序 - >創建我的服務器 - >創建監聽器 - >創建一個線程爲每個客戶

現在的問題是:如果我分配一個屬性OnData = procedure(const Received:string)的對象;到服務器,然後,這個相同的過程被傳遞給客戶端線程,所以當線程獲得一些數據時,它將能夠將它傳遞迴服務器的創建者。在僞代碼:

//My program 
MyServer:= TServer.Create(); 
MyServer.Ondata:= SomeProcedure; 

//The client thread 
//When data is received 
if (FServer <> nil) then 
    if Assigned(FServer.Ondata) then 
    Fserver.Ondata(ReceivedString).. 

的問題,這裏有:

1 - 我明白,如果10個線程同時執行該過程,該過程將在客戶端線程上下文中執行,因此是責任我的程序(程序的實際「所有者」)進行同步。是對的嗎?

2-如果10個不同的線程執行這個過程,我有10個過程的「實例」,它自己的數據同時運行嗎?

3-我是否還需要保護服務器對象上的OnData(例如,使用關鍵部分),還是可以將其保留到「實際」過程?

回答

3
  1. 是的。當線程運行時,它運行的所有代碼都會在自己的線程上下文中執行,除非該代碼已經發送到另一個線程,例如使用Synchronize方法。

  2. 差不多。 TThread對象有10個實例,每個都有自己的數據,同時運行。實際代碼只有一個副本可用於該過程,但多個數據對象可以一次使用它。

  3. 任何不是線程安全的代碼(可能訪問VCL,或者將寫入任何共享數據,或從共享數據中讀取其他可能寫入的數據)需要受到保護。