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

时间:2018-07-16 10:08:10

标签: c++ multithreading function class

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

>>> df = pd.DataFrame([['a'], ['a'], ['a'], ['b'], ['b'], ['a']], columns=['A'])
>>> df
   A
0  a
1  a
2  a
3  b
4  b
5  a
>>> df.groupby('A').cumcount()
0    0
1    1
2    2
3    0
4    1
5    3
dtype: int64
>>> df.groupby('A').cumcount(ascending=False)
0    3
1    2
2    1
3    1
4    0
5    0
 dtype: int64

,其他成员函数是

    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处发生错误,这表明 错误3错误C2064:术语未评估为带有1个参数的函数

所以任何人都可以告诉我为什么会出现此错误,请告诉解决方案

3 个答案:

答案 0 :(得分:0)

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

您只需在lambda中调用该成员,然后将该lambda传递给std::thread的构造函数即可。

答案 1 :(得分:0)

您需要传递类实例指针:

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

答案 2 :(得分:0)

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

您还需要等线程完成后再返回,该线程是多余的。也许您希望线程在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