Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:必须调用对非静态成员函数的引用_C++_Multithreading_Qt - Fatal编程技术网

C++ Qt:必须调用对非静态成员函数的引用

C++ Qt:必须调用对非静态成员函数的引用,c++,multithreading,qt,C++,Multithreading,Qt,我是Qt新手,今天我一直在尝试调整我的应用程序,使之能够与QFuture一起工作,以便在主线程之外同时运行一些任务 我有一种方法,可以更改QImage的饱和度值,该方法返回要绘制到我的QGraphicsView的QPixmap对象。这一切都很好,不使用线程,但很明显,它在主线程上非常密集,所以我想把它移开 我读了几篇关于Qt中线程的文章,发现v5支持a,这听起来非常适合我的用例,因为我认为我可以将函数分派到一个新线程上,如下面的代码片段所示: void MainWindow::on_slideS

我是Qt新手,今天我一直在尝试调整我的应用程序,使之能够与
QFuture
一起工作,以便在主线程之外同时运行一些任务

我有一种方法,可以更改
QImage
的饱和度值,该方法返回要绘制到我的
QGraphicsView
QPixmap
对象。这一切都很好,不使用线程,但很明显,它在主线程上非常密集,所以我想把它移开

我读了几篇关于Qt中线程的文章,发现v5支持a,这听起来非常适合我的用例,因为我认为我可以将函数分派到一个新线程上,如下面的代码片段所示:

void MainWindow::on_slideSaturation_valueChanged(int value)
{
    QFuture<QPixmap> future = QtConcurrent::run(slider->modifySaturation, value, image);
    future.waitForFinished();
    image = future.result();
    renderImageToCanvas();
    modified = true;
}

您应该调用
QtConcurrent::run
这样:

QFuture<QPixmap> future = QtConcurrent::run(slider, 
                                            &Sliders::modifySaturation,  
                                            value, image);
QFuture future=QtConcurrent::run(滑块,
&滑块::修改饱和度,
价值、形象);

但我认为你用错了。您在\u slideSaturation\u valueChanged上的
(我假设在主线程中执行)插槽将被阻止,直到
future.waitForFinished()
返回。

谢谢Hank,有什么建议可以改进吗?正如我所说,我对Qt是新手,发现整个体验既有趣又令人困惑!谢谢。@Alex在您的场景中,我将使用一个worker对象,它在完成任务时发出信号。使用将此辅助对象移动到新线程。使用该信号将
QImage
对象发送到主线程。然后使用这个
QImage
对象来更新你的GUI。谢谢你,thuga,我将进行更多的文档阅读,并再次尝试使用信号和slots@Alex文档中有一个很好的worker对象示例。在主线程之外的其他线程中使用
QPixmap
是不安全的。请改用
QImage
。您能为我的应用程序提供更好的结构化方法吗?
QFuture<QPixmap> future = QtConcurrent::run(slider, 
                                            &Sliders::modifySaturation,  
                                            value, image);