无法从QTcpServer捕获newConnection()信号

时间:2010-05-12 15:24:50

标签: visual-studio qt

我试图在QT中创建一个简单的服务器线程来接受连接,但是虽然服务器正在监听(我可以连接我的测试应用程序)但是我无法获取newConnection()信号。< / p>

对于我在这里失踪的任何帮助都将不胜感激!


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 个答案:

答案 0 :(得分:2)

首先,我可以说你的服务器存在于新线程中,而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