我在Qt中遇到了一些问题。我在GUI线程中分配了一些参数:
newton.h (工作线程):
class Newton : public QThreadresic.cpp (GUI线程):
.
.
.
Newton mythread;
resic::resic(QWidget *parent) :
QWidget(parent),
ui(new Ui::resic)
{
ui->setupUi(this);
mythread.start();
}
void resic::on_PushButton_clicked()
{
w1=ui->doubleSpinBox_2->value();
um1=ui->doubleSpinBox->value();
alpha1=ui->doubleSpinBox_3->value();
et01=ui->doubleSpinBox_4->value();
Er1=ui->doubleSpinBox_11->value();
Rx1=ui->doubleSpinBox_12->value();
xa1=ui->doubleSpinBox_8->value();
xb1=ui->doubleSpinBox_9->value();
q1=ui->doubleSpinBox_10->value();
ya1=(q1-2*q1);
yb1=ui->doubleSpinBox_10->value();
maxl1=ui->spinBox->value();
}我想在点击按钮后将这些参数发送到工作线程,然后在这个工作线程中运行一些计算。但我不知道如何发送参数。你能给我一些建议吗?
非常感谢。
发布于 2014-04-03 05:04:26
在工作线程中运行一段代码的一个简单解决方案是利用Qt并发框架。另一种解决方案是put the worker into a QObject,并直接使用QThread。
struct Parameters {
double w1, um1, alpha1, et01, ...;
};
struct Result {
...
};
Result calculate(const Parameters & p) {
...
}
class resic : public QWidget {
...
QFutureWatcher<Result> m_futureWatcher;
QScopedPointer<Ui::resic> ui;
Q_SLOT void onResults();
...
};
resic::resic(QWidget * parent) : QWidget(parent), ui(new Ui::resic)
{
connect(&m_futureWatcher, SIGNAL(finished()), SLOT(onResults()));
}
resic::~resic() {}
Parameters resic::get()
{
Parameters p;
p.w1=ui->doubleSpinBox_2->value();
p.um1=ui->doubleSpinBox->value();
p.alpha1=ui->doubleSpinBox_3->value();
p.et01=ui->doubleSpinBox_4->value();
...
return p;
}
void resic::on_PushButton_clicked()
{
Parameters const p(get());
QFuture<Result> future = QtConcurrent::run(&calculate);
m_futureWatcher.setFuture(future);
}
void resic::onResults()
{
Result const r = m_futureWatcher.result();
...
}发布于 2014-04-03 14:55:26
重要的是要记住,QThread对象通常位于创建它的线程中,而不是它所管理的线程中。这个经常被忽视的细节意味着QThread的插槽将在其主线程的上下文中执行,而不是在它所管理的线程的上下文中执行。因此,在QThread子类中实现新的插槽容易出错并且不被鼓励。
您可以从QObject继承“牛顿”类,在堆上创建该类的对象,并将其移动到新线程中。
它可以像这样做:
mythread = new Newton();
QThread * th = new QThread();
mythread->moveToThread(th);
QObject::connect(th,SIGNAL(started()),mythread,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),mythread,SLOT(OnFinished()));
th->start();您在类Newton中的初始化和终止任务应该分别在OnStarted()和OnFinished()插槽中完成。
现在,您可以在运行计算的工作线程中实现一个槽。您可以将GUI线程中的信号连接到包含要发送的参数的插槽。当沿着参数发出该信号时,工作线程中的计算槽将使用适当的参数启动。
https://stackoverflow.com/questions/22822683
复制相似问题