Gra*_*oob 10 user-interface qt multithreading
我在更新进度条时的第一个天真就是在我的循环中包含以下几行,正在进行处理,制作如下:
while(data.hasMoreItems())
{
doSomeProcessing(data.nextItem())
//Added these lines but they don't do anything
ui->progressBar->setValue(numberProcessed++);
ui->progressBar->repaint();
}
Run Code Online (Sandbox Code Playgroud)
我认为repaint()在更新GUI时添加会使执行暂停,但显然它并不那么简单.看完问题后:
看起来我将不得不将数据处理放在不同的线程中,然后将来自数据处理线程的信号连接到GUI线程以更新进度条.我对GUI和线程缺乏经验,我想知道是否有人能指出我正确的方向,即我应该使用什么Qt类来实现.我猜我需要一个QThread对象,但我一直在查看QProgressBar文档,但它没有提出线程主题.
Kal*_*son 13
正如@rjh和@Georg指出的那样,基本上有两种不同的选择:
如果您正在进行任何非平凡的处理,我建议将处理移至线程.
关于线程最重要的事情是除了主GUI线程(你没有启动或创建)之外,你永远不能直接从线程内更新GUI.
QObject :: connect()的最后一个参数是Qt :: ConnectionType枚举,默认情况下会考虑是否涉及线程.
因此,您应该能够创建一个QThread执行处理的简单子类:
class DataProcessingThread : public QThread
{
public:
void run();
signals:
void percentageComplete(int);
};
void MyThread::run()
{
while(data.hasMoreItems())
{
doSomeProcessing(data.nextItem())
emit percentageCompleted(computePercentageCompleted());
}
}
Run Code Online (Sandbox Code Playgroud)
然后在GUI代码中的某处:
DataProcessingThread dataProcessor(/*data*/);
connect(dataProcessor, SIGNAL(percentageCompleted(int)), progressBar, SLOT(setValue(int));
dataProcessor.start();
Run Code Online (Sandbox Code Playgroud)