Я новичок в потоках и классах и пытаюсь создать класс. У меня есть две функции-члена, в которых один вызывает другой с помощью потока.
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 не является функцией, принимающей один аргумент. Это функция член, и они разные.
@PasserBy, потому что он постоянно принимает кадр изображения, я буду использовать IPC позже, чтобы остановить поток
Итак, как вызвать эту функцию-член с помощью потока
Возможный обман «Начать обсуждение с функцией-членом».
В сторону: почему вы используете префикс m_ для локальных переменных некоторый? Это активно вводящий в заблуждение использование венгерской нотации
Возможный дубликат Начать поток с функцией-членом





Вы не можете сделать это с функциями-членами, поскольку указывается ошибка. Но поскольку вы используете std::thread, я уверен, что вы используете как минимум C++ 11. Следовательно, у вас есть доступ к лямбдам.
Вы можете просто вызвать член в лямбде и передать эту лямбду конструктору std::thread.
Вам нужно передать указатель экземпляра класса:
std::thread acquiringThread(&CSocket::callReceiveFxn, this, m_SocketIn);
Вам не хватает значения (неявного) параметра 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.
Сэр, StartCamera () вызывает из основной функции, если я использую отсоединение, тогда и main, и callReceiveFxn работают одновременно.
Вы создаете поток только для того, чтобы сразу же дождаться его завершения. Нить тоже никогда не возвращается. В этом нет смысла.