2012-02-20 139 views
2

在我的应用程序在不同的线程槽我有在对话框以下代码:连接信号/使用QtConcurrent ::运行

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)); 
} 

我在做一些阅读,看到QFutureQFutureWatcher支持监控进度值(这将w^ork在这种情况下很棒!),但是这些不能与QtConcurrent::run一起使用。

我该如何去将单独线程上发出的信号连接到主线程上的插槽,以便我可以监视发射器线程上调用的函数的进度?

* 编辑 - *我实际上发现我的代码有错误,但似乎没有影响。我忘了的信号后,添加this作为参数

connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress))); 
+0

我真的不明白,乍一看这似乎应该工作。该线程从'drive'发出'FileProgressChanged' - 正在调用'OnFileProgressChanged'吗?从一个线程发送信号到另一个线程的插槽应能正常工作(它会被排队)。 – 2012-02-20 20:38:27

+0

在发出的函数上,代码是'发出FileProgressChanged(p)'。如果我进入这一步,它会将我带到[this](http://pastebin.com/hhSa8WjV),但我的断点OnFileProgressChanged永远不会被击中。 – Lander 2012-02-20 20:46:31

回答

1

尝试使用connect()QueuedConnection,如:

connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress)), Qt::QueuedConnection); 

连接应该已经被默认排队(因为发射器和接收器在不同的线程),但这只是使其更加明确。

编辑:问题是,Progress类型未注册Qt的元对象系统。加入qRegisterMetaType<Progress>("Progress");修复了这个问题。

+0

没有骰子。我做了一些更多的搜索,我相信*答案在于[这个问题](http://stackoverflow.com/questions/7881052/qt-qthread-trouble-using-signal-slot-going-from-worker-对GUI)。没有参数,信号/插槽连接正常工作。 – Lander 2012-02-21 00:54:16

+1

这也是可能的。你需要在connect()调用之前有一个'qRegisterMetaType (“Progress”);''''。尽管如此(无论是在编译时还是运行时),都应该抛出这个错误。 – 2012-02-21 00:59:13

+0

经过测试,这是问题!非常简单的修复,谢天谢地。感谢您的帮助。 – Lander 2012-02-21 01:01:30

0

看起来问题不在于跨线程信号/插槽,而是与参数Progress相反。 This问题的答案进入进一步的细节,但解决方案是由在做这方面的进度被宣布在头文件中的以下发现:

struct Progress 
{ 
    int Current; 
    int Maximium; 
    std::string FilePath; 
    std::string FolderPath; 
    int TotalMinimum; 
    int TotalMaximum; 
}; 

Q_DECLARE_METATYPE(Progress) 

在我的表单类:

qRegisterMetaType<Progress>(); 
    connect(Drive, SIGNAL(FileProgressChanged(const Progress&)), this, SLOT(OnFileProgressChanged(const Progress&)), Qt::QueuedConnection); 

更改Progressconst Progress&最有可能不需要,但我在测试时离开它。