【问题标题】: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_前缀?这是积极误导使用匈牙利符号

标签: c++ multithreading function class


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多