簡體   English   中英

Indy TCP客戶端線程

[英]Indy TCP client in thread

此線程之后 ,我嘗試使用以下方法制作C ++ Builder XE5應用程序:

  • 主要形式
  • TIdTCPClient
  • TIdTCPClient的連接的TThread ,它將打開套接字,發送請求,然后無限期地偵聽多個響應
  • 套接字上發生的操作將導致主窗體上的更新

我一直找不到任何例子。 據我所知,Indy Demos頁面上鏈接的示例均未在其客戶端中使用任何線程。

我的問題是:

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

目前,我對主要事件采取措施以響應每個事件,也響應於在套接字上接收數據。 目前,我的代碼中充滿了臨時變量和存根函數,因為“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM