C++ 使用QT进程或线程运行函数?

C++ 使用QT进程或线程运行函数?,c++,qt,qthread,qprocess,qtconcurrent,C++,Qt,Qthread,Qprocess,Qtconcurrent,我想使用不同的线程或QProcess或其他更有效且性能更好的方法来运行一些函数。我正在尝试为校准器构建一个gui,只要我按下校准按钮,它就需要校准。对于校准,我有一些功能来完成。但是,执行此校准过程需要一些时间。在校准完成之前,gui将保持无响应状态。所以我在这里要做的是,我想在一些并行进程、线程或其他东西中运行这个函数 #include "widget.h" #include "ui_widget.h" #include <iostream>

我想使用不同的线程或
QProcess
或其他更有效且性能更好的方法来运行一些函数。我正在尝试为校准器构建一个gui,只要我按下校准按钮,它就需要校准。对于校准,我有一些功能来完成。但是,执行此校准过程需要一些时间。在校准完成之前,gui将保持无响应状态。所以我在这里要做的是,我想在一些并行进程、线程或其他东西中运行这个函数

#include "widget.h"
#include "ui_widget.h"

#include <iostream>
#include <sstream>

#include <QtConcurrent/QtConcurrent>
#include <QFuture>

using namespace Eigen;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    ui->lineEdit->setReadOnly(true);
        
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_pressed()
{
    ui->plainTextEdit->appendHtml("<div style='color: green;'> Calibrating .....  </div>");

    QString body = ui->comboBox->currentText();
    int body = body.toInt();
    /*
    I want to run calib function here in separate thread or QtConcurrent so my gui will stay resposive even my function takes some time close to 1 min to do calibration
    
    */

}

void Widget::printReceivedBody(int x)
{
    
}

    

    
void Widget::Calib(int x)
{

    printReceivedBody(int x)
}
#包括“widget.h”
#包括“ui_widget.h”
#包括
#包括
#包括
#包括
使用名称空间特征;
Widget::Widget(QWidget*父项):
QWidget(母公司),
ui(新ui::小部件)
{
用户界面->设置用户界面(此);
ui->lineEdit->setReadOnly(真);
}
小部件::~Widget()
{
删除用户界面;
}
void小部件::在按下按钮时()
{
ui->plainTextEdit->appendHtml(“校准…”);
QString body=ui->comboBox->currentText();
int body=body.toInt();
/*
我想在单独的线程或QtConcurrent中运行calib函数,这样我的gui将保持响应,即使我的函数需要花费接近1分钟的时间来进行校准
*/
}
void小部件::printReceivedBody(int x)
{
}
void小部件::Calib(intx)
{
printReceivedBody(int x)
}
我检查了堆栈和qt中的一些问题,但无法解决我的问题。我发现了一些问题,但正在尝试运行可执行文件。我也可以通过可执行文件来执行,但我想尝试上述方法,而不是使用可执行文件

我访问了qt文档,但该文档让我更加困惑:-(


有人能告诉我怎么做吗?

为了保持GUI的响应性,需要在后台线程中执行繁重的处理

您可以使用标准库运行线程:

#include <thread>
...
std::thread t(Calib, 42);
...
t.join();
#包括
...
标准:螺纹t(口径,42);
...
t、 join();
显然,不要在主线程中同步连接,否则您将失去它的所有好处

为了显示结果,Qt不允许从后台线程修改GUI,因此您必须将一个信号排队,即使用
Qt::QueuedConnection
配置
connect


A
QProcess
意味着运行一个外部进程(如果可能更清楚的话,它是一个可执行文件)。在我看来,这不是您需要的

您可能需要使用
QThread
来运行校准功能

正如您已经阅读了文档一样,让我们提供一些示例,说明如何在QT中使用
QThread
执行函数

//执行lambda
void主窗口::onButton1Click()
{
qDebug()setText(“开始计数”);
auto function=std::bind(&mainfown::count,this);
QThread*l_thread=QThread::create(函数);
l_线程->开始();
}
更新: 对于您(在更新的问题中),您可以按如下方式运行校准

void小部件::按下按钮()
{
ui->plainTextEdit->appendHtml(“校准…”);
QString body=ui->comboBox->currentText();
int body=body.toInt();
/*
我想在单独的线程或QtConcurrent中运行calib函数,这样我的gui将保持响应,即使我的函数需要花费接近1分钟的时间来进行校准
*/
//像这样
//例如,您可以使用arumgint int x=15调用Widget::Calib
int x=15;
auto func=std::bind(&Widget::Calib,this,x));
QThread*QThread=QThread::create(func);
qthread->start();
//如果要在继续之前等待QThread完成,可以添加
//qthread.wait()
}
仅供参考,下面是一个使用
QProcess
启动windows命令行
cmd.exe
并执行带参数的somme
copy
命令的示例

#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QCore应用程序应用程序(argc、argv);
QProcess*processus=新的QProcess();
QStringList-args;
QString路径(“/path_accentué”);

参数您不想运行可执行文件,但您想知道是否应该使用QProcess?QProcess就是这么做的。因此,如果您不想运行可执行文件,您可以排除QProcess。查找示例。示例很多。或者是另一个选项。我几天前回答了类似的问题。不要使用
join()
,因为它会阻塞主线程,从而冻结GUI@AdrianMaire.非常感谢。我将对此进行研究。但我更喜欢在其中使用qt功能,例如QtConcurrent或其他什么。将Windows路径与跨平台API一起使用有什么意义?始终使用“/”进行编码分隔符,没有字母。尤其是BSD头像。谢谢你的建议。我以前做过的一个例子中的一个坏拷贝粘贴。它是正确的。如果你想查看它并测试,我会用你的案例更新我的回复。你至少需要在QT5.10上。在文档中,你应该看到:“这个函数是在Qt 5.10中引入的。”另外,确保在QT项目文件(即.pro文件)中有这个QT+=core子句。如果已经有了一些东西,请添加“core”,这样它现在可以工作了吗?