Не удается поймать сигнал newConnection () от QTcpServer - PullRequest
2 голосов
/ 12 мая 2010

Я пытаюсь создать простой серверный поток в QT для принятия соединения, однако, хотя сервер прослушивает (я могу подключиться к моему тестовому приложению), я не могу получить сигнал newConnection (), на который будет действовать.

Любая помощь в том, что мне здесь не хватает, будет очень признательна!


class CServerThread : public QThread
{
   Q_OBJECT

protected:
   void run();

private:
   QTcpServer*  server;

public slots:
   void  AcceptConnection();
};


void CServerThread::run()
{
   server = new QTcpServer;

   QObject::connect(server, SIGNAL(newConnection()), this, SLOT(AcceptConnection()));

   server->listen(QHostAddress::Any, 1000); // Any port in a storm

   exec(); // Start event loop
}


void CServerThread::AcceptConnection()
{
   OutputDebugStringA("\n***** INCOMING CONNECTION"); // This is never called!
}

1 Ответ

2 голосов
/ 12 мая 2010

Прежде всего я могу сказать, что ваш сервер живет в новом потоке, а экземпляр CServerThread живет в другом потоке (в потоке этот экземпляр был создан). Соединение сигнала / слота, которое вы создаете, является неопределенным и использует доставку событий сохранения потока между циклами событий двух разных потоков. Это на самом деле может вызвать такую ​​проблему, если поток, в котором вы создаете CServerThread, не имеет работающего цикла событий Qt.

Я предлагаю вам создать класс MyServer, который создает QTcpServer и вызывает listen и подключает сигнал QTcpServer :: newConnection () к своему собственному слоту. Затем переписайте ваш метод запуска потока сервера примерно так:

void CServerThread::run() {
   server = new MyServer(host,port);
   exec(); // Start event loop
}

В этом подходе и объект обработки QTcpServer, и объект обработки newConnection живут в одном потоке. С такой ситуацией легче справиться.

У меня есть один очень простой рабочий пример:

Заголовок: http://qremotesignal.googlecode.com/svn/tags/1.0.0/doc/html/hello_2server_2server_8h-example.html

Источник: http://qremotesignal.googlecode.com/svn/tags/1.0.0/doc/html/hello_2server_2server_8cpp-example.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...