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

Posted

技术标签:

【中文标题】使用线程从另一个成员函数调用一个成员函数【英文标题】:Call one Member function from another member function using thread 【发布时间】:2018-07-16 10:08:10 【问题描述】:

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

    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 个参数的函数

谁能告诉我为什么会出现这个错误,请告诉我解决方案

【问题讨论】:

您创建一个线程只是为了立即等待它完成。该线程也恰好永远不会返回。这没有意义。 错误告诉你CSocket::callReceiveFxn 不是一个接受一个参数的函数。它是一个 member 函数,它们是不同的。 @PasserBy 因为它不断地拍摄图像帧我将使用 IPC 稍后停止线程 那么如何使用线程调用该成员函数 旁白:为什么一些局部变量使用m_前缀?这是积极误导使用匈牙利符号 【参考方案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

【讨论】:

先生,如果我使用分离,StartCamera() 将从主函数调用,然后 main 和 callReceiveFxn 同时工作【参考方案2】:

您不能对成员函数执行此操作,因为错误说明了这一点。但由于您使用的是std::thread,我敢肯定您至少使用的是 C++11。因此,您可以访问 lambda。

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

【讨论】:

【参考方案3】:

你需要传递类实例指针:

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

【讨论】:

以上是关于使用线程从另一个成员函数调用一个成员函数的主要内容,如果未能解决你的问题,请参考以下文章

在破坏调用期间从另一个线程未定义的行为调用对象上的方法?

如何从另一个类调用指向成员的函数? [复制]

线程调用成员函数

如何在线程中调用其他类的成员函数和变量

MFC中多线程中静态函数调用成员函数的问题

在VC中,多线程如何调用类得成员函数?