Члены класса C ++ доступны из потока - PullRequest
0 голосов
/ 27 августа 2018

У меня есть базовый класс, который используется в качестве интерфейса для различных типов соединений, таких как USB, TCP и т. Д. Методы являются чисто виртуальными и реализованы в своих подклассах.

Как вы можете видеть в моем TCP_Conn, я хочу иметь struct, который содержит все, что мне может понадобиться для соединения (сокет, буфер приема и т. Д.).

Запросы на отправку поступают от более высокого API с определенными командами и отправляются напрямую через функцию Send(). В этой функции отправки есть управляющая структура, которая ожидает, пока RCThread получит полный ответ от сервера.

Я только читаю new_message из подкласса и пишу в него из потока.

Моя проблема в том, что я получаю сообщение:

ссылка на нестатический элемент должна относиться к определенному объекту

При доступе к моему объекту данных TCP_RC_data внутри recvfromTCP().

Так что я считаю, что реальная проблема здесь в том, что Я не совсем понимаю, как создать экземпляр объекта типа RECEIVE_STATE, к которому можно получить доступ из потока и моего класса.

Как мне этого добиться?
Спасибо за любую помощь!

Вот мой код:

class TCP_Conn : Conn_Base
{
private: 
    struct RECEIVE_STATE { /* ... */ } TCP_RC_data; //Contains SOCKET, Receive_buffer, connection state (i.e. Terminating)
    char[] new_message;
    SOCKET TCP_Socket;

public: 
    Connect();
    Disconnect();
    Send(char *buffer);

    startRCThread();
    endRCThread();
    RCThread(); 
        recvfromTCP(); 
};

void TCP_Conn::StartReceiveThread()
{
    TCP_RC_data.GlobalReceiveThreadState = THREAD_STATE_STARTING;
    std::thread RCThread(&TCP_Conn::MSG_Receive_Thread, this);                
    RCThread.detach();
    while (RC_Thread_data.GlobalReceiveThreadState == THREAD_STATE_STARTING)
        Sleep(20);
}

void TCP_Conn::MSG_Receive_Thread()
{
    while (THREAD_STATE_RUNNING) {
        new_message = recvfromTCP(); //Custom Wrapper for recvfrom
    }
}

void TCP_Conn::recvfromTCP()
{
    // ...
    recvfromTimeOut(RC_Thread_data.TCPReceiveSocket, 0, 1000); **ERROR**
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...