我是线程和类的新手,正在尝试创建一个类。我有两个成员函数,其中一个使用线程调用另一个。
>>> 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个参数的函数
所以任何人都可以告诉我为什么会出现此错误,请告诉解决方案
答案 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