Qt应用程序在删除已执行任务时崩溃

时间:2013-02-16 16:01:25

标签: multithreading qt threadpool qtcpsocket

我有多线程服务器(继承QTcpServer)。当出现新连接时,我创建新任务(继承QRunnable),将套接字描述符传递给构造函数并将此任务推送到QThreadpool(有3个工作者)。

QThreadPool::globalInstance()->start(task);

在run()中,我动态创建QTcpSocket,设置套接字描述符并读取第一个接收到的字节。根据这个字节的值,我创建了新的特定任务(也继承了QRunnable),传递给它早期创建的QTcpSocket对象的ctr指针,并将此任务推送到QThreadpool。

此特定任务会导致一些例行和应用程序崩溃。 从日志文件中,我看到了这个特定任务的析构函数被调用。

此外,Qt Creator会抛出下一条错误消息:

QObject:无法为位于其他线程中的父级创建子级。 (Parent是QNativeSocketEngine(0x18c62290),父线程是QThread(0x18c603e0),当前线程是QThread(0x18cc3b60) QSocketNotifier:无法从另一个线程禁用套接字通知程序 QCoreApplication :: sendEvent中的ASSERT失败:“无法将事件发送到不同线程拥有的对象。当前线程18cc3b60。接收器''(类型'QNativeSocketEngine')是在线程18c603e0中创建的”,文件内核/ qcoreapplication.cpp,第420行

我发现了类似的帖子但不幸的是我无法理解如何解决我的问题。 求你帮帮我。

1 个答案:

答案 0 :(得分:1)

您不能在两个不同的线程中使用QTcpSocket,因为QObject不是线程安全的。

您已在第一个任务中创建了QTcpSocket,因此它“生活”在与该任务相关联的线程中。如果你将它的指针传递给另一个QRunnable,那么第二个线程将尝试访问它,这会破坏它。

您需要以不同线程之间不共享QTcpSocket的方式重新设计您的应用。一种可能性是在原始任务中实现不同的特定功能,并根据第一个接收到的字节选择适当的功能