gpt4 book ai didi

c++ - 使用 Qt GUI 打包线程程序

转载 作者:太空狗 更新时间:2023-10-29 20:58:25 25 4
gpt4 key购买 nike

我有一个工作完成的应用程序,它使用多个 boost 线程并且可以在命令行界面上正常工作。

我用“包装器”类打包了这个程序,这样我就可以从 Qt 主窗口运行程序中的函数。

例如:

netWrap.getImgs(ui->sampleNameEdit->text().toStdString());

这从文本框中使用参数 sampleName 的网络程序获取图像,并从由按钮触发的插槽中调用。

一切正常,但是,某些功能(例如上面的功能)可能需要大约 20 秒才能运行,这会导致 GUI 挂起。我希望它不要挂起 GUI。

显而易见的选择是使用 QThread,但我不想向我的程序添加额外的类,因为这应该只是一个简单的前端。有没有一种方法可以在线程中运行此函数并等待终止信号而无需挂起 GUI?

编辑:QFutures:

 QFuture<int> run = QtConcurrent::run(&(netWrap.getImgs), ui->sampleNameEdit->text().toStdString());

这会产生 4 个错误,最相关的可能是:

error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say '&networkWrapper::getImgs' [-fpermissive]
QFuture<int> run = QtConcurrent::run(&(netWrap.getImgs), ui->sampleNameEdit->text().toStdString());

和:

error: no matching function for call to 'run(int (networkWrapper::*)(std::string), std::string)'
QFuture<int> run = QtConcurrent::run(&(netWrap.getImgs), ui->sampleNameEdit->text().toStdString());

最佳答案

您不能将 QThread 子类化以在不同的线程中运行某些东西。 QThread 通过信号/槽使用。

http://doc.qt.io/qt-5/qthread.html#started

默认 QThread::run() 启动一个事件循环,允许您在另一个线程中处理诸如网络事件之类的事情。这意味着您连接到 QThread::started 信号,启动您的请求,它们在不同的线程中得到处理。然后,您可以用另一个信号通知您的主 GUI 线程,表明您已完成并且数据可用。

如果您只需要在不同的线程中调用某个函数,那么请使用 Qt Concurrent。这比 QThread 更容易使用。

http://doc.qt.io/qt-5/qtconcurrent.html#run

void my_function(int a, double b) {
.... do something in another thread ....
}
....
auto some_function = std::function<void(int, double)>(&my_function);
QFuture<void> ret = QtConcurrent::run(some_function, 10, 20.0);
....

或者不使用任何 std::function,直接使用普通函数指针,

QFuture<void> ret = QtConcurrent::run(&my_function, 10, 20.0);

调用类成员,同样简单,

class Foo {
public:
void foo(int a) {}
};

...
Foo *foo_instance = new Foo;
QFuture<void> ret = Qtconcurrent::run(foo_instance, &Foo::foo, 10);
...

并且您的函数正在另一个线程中运行。就这么简单。

注意:不要从非 GUI 线程访问/操作 GUI 类。

关于c++ - 使用 Qt GUI 打包线程程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27693804/

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