使用线程从另一个成员函数调用一个Member函数

Call one Member function from another member function using thread

本文关键字:一个 函数 Member 函数调用 线程 另一个 成员      更新时间:2023-10-16

我是线程和类的新手,并尝试创建一个类。我有两个成员函数,其中一个使用线程调用另一个。

bool CSocket::StartCamera()
{
bool m_SendFlag;
m_SocketIn = socketInitialize(m_CameraIP, m_CameraPort);
if (m_SocketIn == INVALID_SOCKET)
return false;
m_SendFlag = sendCommand(m_SocketIn);
if (!m_SendFlag)
return false;
std::thread acquiringThread(&CSocket::callReceiveFxn, m_SocketIn);
acquiringThread.join();
}

其他成员功能是

void CSocket::callReceiveFxn(SOCKET socket)
{
unsigned char *m_frameBuffer = NULL;
while (true)
{
m_frameBuffer = receivePacket(socket);
m_ImageQ.Enqueue(m_frameBuffer, MAX_BYTE_PER_FRAME);
}
}

所以我的StartCamera函数使用线程调用callReceiveFxn。但在std::thread acquiringThread(&CSocket::callReceiveFxn, m_SocketIn);发生错误错误3错误C2064:术语未计算为采用1个参数的函数

所以有人能告诉我为什么会出现这个错误吗?请告诉我的解决方案

您缺少callReceiveFxn的(隐式(this参数的值。

您还需要等待线程完成后再返回,线程是多余的。也许您希望线程在StartCamera完成后继续?

未能在函数末尾返回值。

我不喜欢成员使用匈牙利符号,但更糟糕的是,当地人使用匈牙利符号。

bool CSocket::StartCamera()
{
m_SocketIn = socketInitialize(m_CameraIP, m_CameraPort);
if (m_SocketIn == INVALID_SOCKET)
return false;
if (!sendCommand(m_SocketIn))
return false;
std::thread(&CSocket::callReceiveFxn, this, m_SocketIn).detach();
return true;
}

注意,callReceiveFxn可能不需要参数,它可以访问m_SocketIn

正如错误所述,您不能对成员函数执行此操作。但由于您使用的是std::thread,我确信您至少使用了C++11。因此,您可以访问lambdas。

您可以简单地调用lambda中的成员,并将该lambda传递给std::thread的构造函数。

您需要传递类实例指针:

std::thread acquiringThread(&CSocket::callReceiveFxn, this, m_SocketIn);