【发布时间】:2012-02-20 19:57:34
【问题描述】:
在我的应用程序中,我在对话框中有以下代码:
connect(drive, SIGNAL(FileProgressChanged(Progress)), SLOT(OnFileProgressChanged(Progress)));
QtConcurrent::run(this, &ProgressDialog::PerformOperation, Operation, *Path, OutPath, drive);
PerformOperation函数最终调用drive中的一个函数,该函数发出信号FileProgressChanged,而我的OnFileProgressChanged函数如下:
void ProgressDialog::OnFileProgressChanged(Progress p)
{
if (ui->progressCurrent->maximum() != p.Maximium)
ui->progressCurrent->setMaximum(p.Maximium);
ui->progressCurrent->setValue(p.Current);
if (ui->groupBoxCurrent->title().toStdString() != p.FilePath)
ui->groupBoxCurrent->setTitle(QString::fromStdString(p.FilePath));
}
我正在阅读并看到 QFuture 和 QFutureWatcher 支持监控进度值(在这种情况下效果很好!),但它们不能与 QtConcurrent::run 结合使用。
我将如何将在单独线程上发出的移动信号连接到我的主线程上的插槽,以便我可以监控在发射器线程上调用的函数的进度?
*Edit -- * 实际上我发现我的代码有一个错误,但它似乎没有影响。我忘了在信号后添加this 作为参数
connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress)));
【问题讨论】:
-
我不太明白,乍一看这似乎应该可以工作。线程从
drive发出FileProgressChanged——OnFileProgressChanged是否被正确调用?从一个线程向另一个线程的槽发出信号应该可以正常工作(它被排队)。 -
在发出的函数上,代码是
emit FileProgressChanged(p)。如果我介入,它会将我带到this,但我在 OnFileProgressChanged 处的断点永远不会被命中。
标签: c++ multithreading qt qtconcurrent