QSocketNotifier:只能与使用QThread启动的线程一起使用错误。

8

我将尝试使用QLocalServer作为IPC解决方案。Qt的版本是4.6。

这是我的main.cpp:

int main(int argc, const char*argv[]) {  
  QServer test();

  while (true) {
  }
}

这是我的QServer类:
class QServer : public QObject
{
 Q_OBJECT

public :
 QServer ();

  virtual ~QServer();

private :  
  QLocalServer* m_server;
  QLocalSocket* m_connection;


private slots:
  void socket_new_connection();
};

QServer::QServer()
{
  m_server = new QLocalServer(this);
  if (!m_server->listen("DLSERVER")) {
    qDebug() << "Testing";
    qDebug() << "Not able to start the server";
    qDebug() << m_server->errorString();
    qDebug() << "Server is " << m_server->isListening();
  }

  connect(m_server, SIGNAL(newConnection()),
          this, SLOT(socket_new_connection()));
}

void
QServer::socket_new_connection()
{
  m_connection = m_server->nextPendingConnection();

  connect(clientConnection, SIGNAL(readyRead()),
          this, SLOT(newData(clientConnection)));
}

这段代码可以编译,但是在运行时,当我尝试连接newConnection()时,出现了一个QSocketNotifier错误:只能与使用QThread启动的线程一起使用。

我已经尝试将整个内容包装在QThread中,但仍然出现相同的错误。

有人能解释我做错了什么或者为什么会涉及到线程吗?


2
提示:作为一个好的操作系统公民,您应该将好的答案标记为“已接受” :-) - Mr. Developerdude
1个回答

13

错误信息有误导性。您需要Qt事件循环才能使用QSocketNotifier。在您的应用程序中以适当的方式创建QApplication(或者如果您不需要任何图形界面,则创建QCoreApplication)即可解决此问题。您的main函数应该如下所示:

int main(int argc, char** argv)
{
    QCoreApplication app(argc, argv);
    QServer test();
    app.exec();
    return 0;
}

QCoreApplication::exec()启动事件循环(该循环取代了您的while (true) {}循环)。


1
这让我想到了一个问题——在创建QApplication对象之前(隐式地在单例内部)我创建了一个QFileSystemWatcher。它在Windows上运行良好,但在Linux上却出现了OP的错误消息。更改构造顺序后,在Windows和Linux上都得到了预期的结果。 - metal
@metal 我也遇到了同样的情况。谢谢你的提示! - Jake Stoeffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接