我有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上构建和运行是可以的 - 没有错误并按预期工作。
答案 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'对象。但是我不能用文档来证明,所以也试着找到它的答案。请注意QScopedPointer
或std::unique_ptr
将始终使用确定性,但QObject::destroyed
信号通过QObject::deletelater
执行延迟释放更容易从确切释放对象时开始出现“意外”。 / p>