gpt4 book ai didi

c++ - Qt 界面卡住后台任务

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:58 24 4
gpt4 key购买 nike

我有一个有趣的问题要解决。我在我的一个项目中使用 Qt 5 来​​阅读网络上的信息。我阅读了 modbus 设备之类的东西,但真正的问题是当网络不可用时。

界面卡住了,我无法与之交互。网络的东西是在一个单独的线程中完成的,或者这就是我的想法。这是一些代码示例:

class TwidoDevice : public QObject
{
Q_OBJECT
public:
explicit TwidoDevice
........ And some useful code

Window.cpp中(主界面)类的使用是:

L1Thread = new QThread();
L1Thread->start();
L1TWD = new TwidoDevice(L1TWD_settings,
L1TWD_Name,
PercentRegisters,
TotalsRegisters,
db, 1);
L1TWD->moveToThread(L1Thread);
connect(this, SIGNAL(startReading()), L1TWD, SLOT(startFired()), Qt::DirectConnection);

在这段代码中,startFired() 开始读取网络上的设备。

Window.cpp 的一些其他函数中:

emit startReading()

执行此代码时,即使我已将 L1TWD 对象移动到 QThread,界面也会卡住。

当我尝试使用 QtCreator 中的内置调试器对其进行调试时,我似乎无法理解对象是否已被移动以及为什么在网络调用期间界面被卡住。

有没有人遇到过同样的问题,解决方法是什么?

感谢您花时间阅读我的问题!

最佳答案

这是主要问题:

connect(this, SIGNAL(startReading()), L1TWD, SLOT(startFired()), Qt::DirectConnection);

您在不同线程中通过直接连接连接接收方和发送方,这将阻塞 UI。鉴于您的插槽执行卡住了,这是预料之中的。您至少有两个问题需要解决。

  • 使用不会跨线程阻塞的默认连接,只是在同一个线程内。所以,你会写这样的东西:

connect(this, SIGNAL(startReading()), L1TWD, SLOT(startFired()));

  • 其次,您可以确保您的线程在出现“网络”问题时不会卡住。

出于调试目的,请在出现此类线程问题时使用 the following methods 打印出当前线程:

[static] QThread * QThread::​currentThread()

Returns a pointer to a QThread which manages the currently executing thread.

this :

[static] Qt::HANDLE QThread::​currentThreadId()

Returns the thread handle of the currently executing thread.

Warning: The handle returned by this function is used for internal purposes and should not be used in any application code.

Warning: On Windows, the returned value is a pseudo-handle for the current thread. It can't be used for numerical comparison. i.e., this function returns the DWORD (Windows-Thread ID) returned by the Win32 function getCurrentThreadId(), not the HANDLE (Windows-Thread HANDLE) returned by the Win32 function getCurrentThread().

关于c++ - Qt 界面卡住后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27291432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com