gpt4 book ai didi

c++ - 使用 Qt 信号/槽而不是工作线程

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:31 24 4
gpt4 key购买 nike

我正在使用 Qt 并希望编写一个类来执行一些网络类型的操作,类似于 FTP/HTTP。该类需要连接到许多机器,一个接一个,但我需要应用程序 UI 在此过程中保持(相对)响应,以便用户可以取消操作、退出应用程序等。我的第一个想法是使用一个用于网络内容的单独线程,但内置的 Qt FTP/HTTP(和其他)类显然避免使用线程,而是依赖于信号和插槽。所以,我想做类似的事情,并希望我能做这样的事情:

class Foo : public QObject
{
Q_OBJECT
public:
void start();

signals:
void next();

private slots:
void nextJob();
};

void Foo::start()
{
...
connect(this, SIGNAL(next()), this, SLOT(nextJob()));
emit next();
}

void Foo::nextJob()
{
// Process next 'chunk'

if (workLeftToDo)
{
emit next();
}
}


void Bar::StartOperation()
{
Foo* foo = new Foo;
foo->start();
}

但是,这不起作用,UI 会卡住,直到所有操作都完成。我希望发射信号实际上不会立即调用插槽,而是会以某种方式被 Qt 排队,从而允许主 UI 继续运行。

那么我需要做什么才能完成这项工作? Qt 如何通过大量似乎在单个线程上执行冗长任务的内置类来实现这一点?

最佳答案

如果您在 UI 线程中执行长时间的工作,UI 将会卡住。避免这种情况的一种方法是偶尔调用一次 QCoreApplication::processEvents()

但是,在您决定这样做之前,您应该非常小心地了解它的作用。调用此函数意味着 GUI 事件可以在您的操作过程中触发。如果这个事件反过来可以创造更多的工作,你最终可以在旧工作中途开始一份新工作。

我不会这么快就放弃工作线程方法。它具有将工作与 GUI 完全分离的优势,因此您可以确定开始的事情将会结束。
您还应该考虑到 Windows 有时会给 GUI 循环引入非常重要的延迟。如果主机有点忙或处于内存抖动状态,您会发现 GUI 事件可能需要几秒钟才能完成并将控制权返回给您的处理。

关于c++ - 使用 Qt 信号/槽而不是工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2559351/

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