gpt4 book ai didi

C++ Builder,TIdTCPServer 的多线程处理

转载 作者:行者123 更新时间:2023-11-28 07:08:56 33 4
gpt4 key购买 nike

我有一个使用 TIdTCPServer 的服务器程序和一个客户端程序。我在一台计算机上运行我的客户端程序,例如 3 次。每次连接客户端时,我都会尝试向备忘录中添加一些内容。这就是问题所在。由于 3 个客户端同时运行并尝试连接到服务器,因此当我运行我的服务器应用程序时。两个客户端同时连接,并且由于 TIdTCPServer 在单独的线程上处理客户端连接,因此会导致死锁(或类似情况)。我尝试使用互斥锁

// Creation of mutex.Inside the constructor of TCPConnection class
ListViewMutex = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
NULL); // unnamed mutex

//我代码中的其他地方

void __fastcall TCPConnection::OnConnect(TIdContext *AContext)
{
DWORD dwWaitResult;

// Request ownership of mutex.

dwWaitResult = WaitForSingleObject(
ListViewMutex, // handle to mutex
7000L); // five-second time-out interval
Adapter->AddToMemo("OnConnect release");
ReleaseMutex(ListViewMutex);
return;
}

就是这样。当我运行我的服务器和客户端连接时,我的服务器应用程序卡住。它甚至无法到达“RelaseMutex(...)”行 3 次(之前假设连接了 3 个客户端)当我删除 Adapter->AddToMemo() 行时,它可以到达 ReleaseMutex(...) 行 3 次(但当然该代码什么都不做)

我是不是以错误的方式使用互斥锁,或者这里有什么问题?

最佳答案

TIdTCPServer 是多线程的。它的 OnConnectOnDisconnectOnExecute 事件在工作线程的上下文中运行。从主 UI 线程之外访问 VCL UI 控件是不安全的。使用互斥体并不能提供足够的保护。 UI 代码必须在主线程中运行。

Indy 有 TIdSyncTIdNotify 类将代码委托(delegate)给主线程,类似于 TThread::Synchronize()TThread::Queue() 方法。尝试这样的事情:

#include <IdSync.hpp>

class AddToMemoNotify : class TIdNotify
{
protected:
TMyAdapterClass *m_Adapter;
String m_Msg;

virtual void __fastcall DoNotify()
{
m_Adapter->AddToMemo(m_Msg);
}

public:
__fastcall AddToMemoNotify(TMyAdapterClass *Adapter, const String &Msg) :
TIdNotify(), m_Adapter(Adapter), m_Msg(Msg)
{
}
};

void __fastcall TCPConnection::OnConnect(TIdContext *AContext)
{
(new AddToMemoNotify(Adapter, "Client Connected")->Notify();
}

void __fastcall TCPConnection::OnDisconnect(TIdContext *AContext)
{
(new AddToMemoNotify(Adapter, "Client Disconnected")->Notify();
}

TIdNotify 是一个自释放对象,它会在 DoNotify() 退出后自行销毁。所以不要手动删除它。

关于C++ Builder,TIdTCPServer 的多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21329115/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com