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;
//...
}
TIdSync沒有組件,但我在找到它。看起來它只適用於TIdThread(目前我正在使用TThread),所以我想我應該嘗試根據其API文檔找出它們的工作原理。 –
不,「TIdSync」不是組件,只是一個類。不,你不需要'TIdThread'來使用它。在XE5中,它只是靜態'TThread :: Synchronize()'方法的一個包裝。在'IdSync.hpp'中根本不應該引用'TIdThread'。對於CB2005之前的C++ Builder版本,它可以,但是您仍然可以在不使用TIdThread的情況下使用TIdSync(它只是在內部創建一個用於自己使用)。 –
謝謝你 –