gpt4 book ai didi

c++ - QT 线程问题...有些东西正在拖延 GUI 响应

转载 作者:行者123 更新时间:2023-11-28 06:46:44 26 4
gpt4 key购买 nike

我遇到了 QT 线程问题,以某种方式拖延了主 GUI。

要回答第一个问题...是的,QThread 没有子类化,并且是以“正确的方式”完成的。

线程是长期运行的(不是“执行 x 然后退出”),并且它的主循环确实有延迟/ sleep 。

线程的主要目的是从其他地方收集数据、合成图像并通过 COM 端口传输该图像。

我认为有一些编码区域可能会造成问题。

我使用自己的“ sleep ”函数,因为 msleep 不可用(仅对 QThread 私有(private))。任何人都可以看到下面的代码有什么问题吗?

void SendImageJob::tSleep(int ms)
{
QElapsedTimer timer;
timer.start();
while ((timer.elapsed() < ms) && !abort)
{
QCoreApplication::processEvents();
}
}

第二个可能成为问题的是通过信号/槽发送到线程/从线程发送的数据量。通过信号发送的图像数据大小约为 16KB,并以 15fps 的速度发送。这对于排队的连接信号来说太多了吗?

我会检查 Qt 信号队列长度,但我不知道如何做到这一点?

提前致谢!

最佳答案

sleep 代码没有任何问题,只是您根本不需要使用它。在 Qt 5 中,线程的 sleep 方法不再是私有(private)的。在 Qt 4 中,您可以轻松解决它。你需要使用这个安全的 QThread 包装器来实现真正的 RAII 优点,所以你也可以在同一个类中公开静态 sleep 方法:

class Thread : public QThread {
using QThread::run; // final, no subclassing
public:
Thread(QObject * parent = 0) : QThread(parent) {}
~Thread() { quit(); wait(); }
using QThread::sleep;
using QThread::msleep;
using QThread::usleep;
};

您的部分问题可能是您使用的是阻塞QObject,这是一个稍微落后的设计。除非您坚持使用阻塞 API(比如损坏的数据库接口(interface)库),否则您的对象应该在任何线程上都能令人满意地执行,包括 GUI 线程。您只需将其移至单独的线程即可减少 GUI 线程的延迟。

明智地实现它的一种方法是利用异步:

class Worker : public QObject {
Q_OBJECT
typedef void (Worker::*State)();
QBasicTimer m_timer;
State m_nextState;
void timerEvent(QTimerEvent * ev) {
if (ev->timerId() != m_timer.timerId()) return;
m_timer.stop();
(this->*m_nextState)();
}
void wait(State state, int ms) {
m_nestState = state;
m_timer.start(this, ms);
}
void state1() {
...
wait(&Worker::state2, 100); // wait 100ms and continue in state2
}
void state2() {
...
}
public:
Worker(QObject * parent = 0) : QObject(parent), m_nextState(&Worker::state1) {
m_timer.start(this, 0);
}
};

如果您可以使用 Qt 5 和 C++11 - lambda 来拯救,这样的代码会变得更清晰。您还可以研究 QStateMachine 的使用。

以 16fps 的速度推送 16kbytes 没什么。

关于c++ - QT 线程问题...有些东西正在拖延 GUI 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24864594/

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