我正尝试在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!
}发布于 2010-05-12 23:42:13
首先,我可以说您的服务器驻留在新线程中,而CServerThread实例驻留在另一个线程中(在创建此实例的线程中)。您正在创建的信号/槽连接是间接的,并在两个不同线程的事件循环之间使用线程保存事件传递。如果你创建CServerThread的线程没有运行Qt事件循环,它实际上会导致这样的问题。
我建议您创建一些MyServer类来创建QTcpServer,调用listen并将QTcpServer::newConnection()信号连接到它自己的插槽。然后重写您的服务器线程run方法,如下所示:
void CServerThread::run() {
server = new MyServer(host,port);
exec(); // Start event loop
}在这种方法中,QTcpServer和newConnection处理对象都位于同一个线程中。这样的情况更容易处理。
我有一个非常简单的工作示例:
Header: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
https://stackoverflow.com/questions/2820246
复制相似问题