我正在创建一个应用程序,该应用程序使用C ++ / Qt 5.6和Boost编写的现有代码库,使用API的功能与服务器进行通信。编写代码的方式是,与服务器的任何通信均由在工作对象中运行的API函数完成。工作对象在QThread()
中运行,并使用moveToThread
移动。
我的问题是,我需要能够立即停止线程并在网络连接断开的情况下断开连接。但是,线程在将数据发送到服务器时会阻塞。如果我尝试通过quit() or wait()
停止线程,该请求仍然会到达服务器,这是不希望的。该API也没有提供任何方法来取消任何正在进行的请求。
我当前的解决方案是终止线程,并在网络连接断开时销毁它拥有的工作对象。然后,当连接到服务器时,我将创建一个新的QThread和新的worker对象。
我知道应该避免terminate()
或任何形式的线程即时终止,例如瘟疫,但我认为它似乎可以正常工作。
在QThread中运行的worker对象通过std::shared_ptr
使用std::make_shared
作为其成员。
还有内存泄漏/损坏的机会吗?
除此之外,由于我在方法中创建了QThread,因此我收到来自QT的警告:
QObject: cannot create children for a parent that is in a different thread
尽管有此警告,我的代码仍然可以运行,但是我有疑问。忽略此警告是否安全?忽视这一点有什么风险/后果?
用QT的中断检查点散布服务器连接代码/使用boost::interruption_point
而不是调用终止将其重写成boost,是否更安全?即
sendData();
if (QThread::currentThread()->isInterruptionRequested())
{
return;
}
sendData();
if (QThread::currentThread()->isInterruptionRequested())
{
return;
}
...
非常感谢您。