0

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

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

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

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

Qt Creator 还会引发下一条错误消息:

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

我发现了类似的帖子,但不幸的是我不明白如何解决我的问题。请帮我。

4

1 回答 1

1

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

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

您需要重新设计您的应用程序,使其QTcpSocket在不同线程之间不共享相同内容。一种可能性是在您的原始任务中实现不同的特定功能,并根据收到的第一个字节简单地选择合适的功能

于 2013-02-17T07:25:53.397 回答