Qt内部线程

时间:2016-07-04 20:56:56

标签: c++ windows qt

我有Qt应用程序,有一些外部库依赖项。我的应用程序和外部库不使用线程(在我看来)。它们的来源中没有thread个字。一个库具有来自QTcpServer的派生,其中没有 listen()方法重载。 (操作系统是Windows)

我创建了一个对象,并在listen()类的构造函数中调用Window方法。控制台上的警告消息出现在listen()方法调用期间:

  

QObject:无法为不同的父级创建子级   线。 (Parent是QJsonRpcTcpServer(0x4c1b38),父亲的线程是   QThread(0x4a8d98),当前线程为QThread(0x47e348)

Qt子系统等创建其他线程,其中一个是UI线程等。某些网格或交集存在或其他东西。在那个程序没有正常工作之后。 (tcp客户端connect并且在程序未关闭之前一直存在)

调试问题的可能载体是什么?

Window::Window( QWidget *parent ) { 
    Service* service = new Service( parent );
    QJsonRpcTcpServer* rpcServer = new QJsonRpcTcpServer( parent );
    rpcServer->addService(service);
    // problem at next line:
    if ( rpcServer->listen(QHostAddress::Any, 42123) ) {
    }
}

一些新信息,当我用QTcpServer替换QJsonRpcTcpServer时,listen()来电时的警告消失。

更多新信息,问题出在Windows上。在FreeBSD上构建和运行是可以的 - 没有错误并按预期工作。

1 个答案:

答案 0 :(得分:2)

  

如何处理调试消息以及工作线程阻止启动的事实?我正进入(状态:   “无法为处于不同线程的父级创建子级。”调试输出中的消息。

有几种方法可以动态分配对象,并且仍然可以在Qt中跟踪它,而不使用QObject base并传递给父(所有者)。例如QScopedPointer作为该“父”对象的类的成员:

/// snip ///
#include <QScopedPointer>
class Service;
class QJsonRpcTcpServer;

class Window : public QWidget
{
   /// snip ///
   QScopedPointer<Service> m_service;
   QScopedPointer<QJsonRpcTcpServer> m_rpcServer;
};

/// snip ///

Window::Window( QWidget *parent ) { 
    m_service.reset(new Service( nullptr ));             // unsure of default 
    m_rpcServer.reset(new QJsonRpcTcpServer( nullptr )); // constructor, take nullptr
    m_rpcServer->addService(m_service);
    // was problem at next line: not anymore
    if ( m_rpcServer->listen(QHostAddress::Any, 42123) ) {
    }
}

我还怀疑QJsonRpcTcpServer::addService负责发布'service'对象。但是我不能用文档来证明,所以也试着找到它的答案。请注意QScopedPointerstd::unique_ptr将始终使用确定性,但QObject::destroyed信号通过QObject::deletelater执行延迟释放更容易从确切释放对象时开始出现“意外”。 / p>