螺紋

2015-06-16 169 views
1

this thread繼印TCP客戶端,我想作一個C++ Builder的XE5應用:螺紋

  • 一種主要形式
  • 一個TIdTCPClient
  • 一個爲TIdTCPClientTThread「 s連接,打開插座,發送請求,然後監聽多個響應無限期
  • 行動插座上發生將導致主窗體上更新

我一直找不到任何例子;從Indy Demos頁面鏈接的例子都不會在客戶端使用任何線程,就我所見。

我的問題是:

  • 如若TIdTCPClient是主要的形式(如設計時間成分),或者它應該是線程類的成員變量?
  • 在由TIdTCPClient觸發的事件中,事件處理程序(它是我主窗體的成員函數)中的代碼是否需要同步?
  • 對於主VCL線程和客戶端線程在TIdTCPClient對象上進行函數調用是否安全?

目前我在主窗體上對每個事件做出響應,並響應接收套接字上的數據。此刻,我的代碼充滿了臨時變量和存根函數,因爲Synchronize需要關閉void(void),並且它是相當意大利麪條。所以我想知道我是否採取了根本錯誤的做法。

回答

1

TIdTCPClient應該在主窗體上(作爲設計時間組件),還是應該是線程類的成員變量?

兩者都可以正常工作。最重要的是,你叫Connect()和其他I/O方法在工作線程(其Execute()方法中)的情況下。

在由TIdTCPClient觸發的事件中,事件處理程序(它是我主窗體的成員函數)中的代碼是否需要同步?

是的,如果他們正在訪問UI控件或其他必須受保護的共享數據。

對於主VCL線程和客戶端線程在TIdTCPClient對象上進行函數調用是否安全?

這取決於具體的電話(例如,在閱讀入站數據的工作線程,至少在客戶端連接在主線程發送出站數據),但我不建議你依賴於。您應該只將所有與客戶端相關的操作保留在工作線程中。

此刻我的代碼充滿了臨時變量和存根函數,因爲Synchronize需要void(void)閉包,並且它是相當意大利麪。

您可以使用Indy的TIdSync/TIdNotify類來幫助您更好地組織該意大利麪代碼。例如,從TIdSync派生一個類,將您的變量移入它,並覆蓋其虛擬DoSynchronize()方法以根據需要調用您的Form方法。然後,您可以創建一個類的實例,根據需要填充其變量,調用它的方法,根據需要讀取其變量,然後釋放它。

#include <IdSync.hpp> 

class TMySync : public TIdSync 
{ 
protected: 
    virtual void __fastcall DoSynchronize(); 
public: 
    // variables... 
}; 

void __fastcall TMySync::DoSynchronize() 
{ 
    // call Form methods, use variables as needed... 
} 

void __fastcall TMyThread::Execute() 
{ 
    //... 
    TMySync *sync = new TMySync; 
    // set variables as needed... 
    sync->Synchronize(); 
    // read variables as needed... 
    delete sync; 
    //... 
} 
+0

TIdSync沒有組件,但我在找到它。看起來它只適用於TIdThread(目前我正在使用TThread),所以我想我應該嘗試根據其API文檔找出它們的工作原理。 –

+0

不,「TIdSync」不是組件,只是一個類。不,你不需要'TIdThread'來使用它。在XE5中,它只是靜態'TThread :: Synchronize()'方法的一個包裝。在'IdSync.hpp'中根本不應該引用'TIdThread'。對於CB2005之前的C++ Builder版本,它可以,但是您仍然可以在不使用TIdThread的情況下使用TIdSync(它只是在內部創建一個用於自己使用)。 –

+0

謝謝你 –