我试图在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!
}
答案 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