![](/img/trans.png)
[英]Change Indy10 TCP ServerExecute thread priority for faster speed of execution?
[英]Indy TCP client in thread
在此線程之后 ,我嘗試使用以下方法制作C ++ Builder XE5應用程序:
TIdTCPClient
TIdTCPClient
的連接的TThread
,它將打開套接字,發送請求,然后無限期地偵聽多個響應 我一直找不到任何例子。 據我所知,Indy Demos頁面上鏈接的示例均未在其客戶端中使用任何線程。
我的問題是:
目前,我對主要事件采取措施以響應每個事件,也響應於在套接字上接收數據。 目前,我的代碼中充滿了臨時變量和存根函數,因為“ Synchronize
需要一個void(void)
閉包,而且它是意大利面條。 所以我想知道我是否采取了根本上錯誤的方法。
TIdTCPClient應該在主窗體上(作為設計時組件)還是在線程類的成員變量中?
兩者都可以正常工作。 重要的是要在工作線程的上下文中(在其Execute()
方法內部Connect()
調用Connect()
和其他I / O方法。
在TIdTCPClient觸發的事件中,是否需要同步事件處理程序(這是我的主要形式的成員函數)中的代碼?
是的,如果他們正在訪問UI控件或其他必須保護的共享數據。
VCL主線程和客戶端線程在TIdTCPClient對象上進行函數調用是否安全?
這取決於特定的調用(例如,至少在連接客戶端時,從主線程發送出站數據,同時讀取工作線程中的入站數據),但是我不建議您依靠它。 您只應將所有與客戶端相關的操作僅保留在工作線程中。
目前,我的代碼中充滿了臨時變量和存根函數,因為“同步”需要一個void(void)閉包,而且它是意大利面條。
您可以使用Indy的TIdSync
/ TIdNotify
類來幫助您更好地組織意大利面條式代碼。 例如,從TIdSync
派生一個類,將變量移入該類,然后覆蓋其虛擬DoSynchronize()
方法以根據需要調用您的Form方法。 然后,您可以創建thee類的實例,在需要時填充其變量,調用其Synchronize()
方法,在需要時讀取其變量,然后釋放它。
#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;
//...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.