Вызов одной функции-члена из другой функции-члена с помощью потока

Я новичок в потоках и классах и пытаюсь создать класс. У меня есть две функции-члена, в которых один вызывает другой с помощью потока.

    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 аргумент

Может ли кто-нибудь сказать мне, почему возникает эта ошибка, и расскажите, пожалуйста, решение для этого

Вы создаете поток только для того, чтобы сразу же дождаться его завершения. Нить тоже никогда не возвращается. В этом нет смысла.

Passer By 16.07.2018 12:09

Ошибка говорит вам, что CSocket::callReceiveFxn не является функцией, принимающей один аргумент. Это функция член, и они разные.

Passer By 16.07.2018 12:10

@PasserBy, потому что он постоянно принимает кадр изображения, я буду использовать IPC позже, чтобы остановить поток

Lucky 16.07.2018 12:15

Итак, как вызвать эту функцию-член с помощью потока

Lucky 16.07.2018 12:16

Возможный обман «Начать обсуждение с функцией-членом».

G.M. 16.07.2018 12:24

В сторону: почему вы используете префикс m_ для локальных переменных некоторый? Это активно вводящий в заблуждение использование венгерской нотации

Caleth 16.07.2018 12:35

Возможный дубликат Начать поток с функцией-членом

Passer By 16.07.2018 13:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
337
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не можете сделать это с функциями-членами, поскольку указывается ошибка. Но поскольку вы используете 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 работают одновременно.

Lucky 16.07.2018 14:10

Другие вопросы по теме