У меня есть базовый класс, который используется в качестве интерфейса для различных типов соединений, таких как 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**
// ...
}