Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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_Progress Bar - Fatal编程技术网

C++ Qt中进度条的正确使用?

C++ Qt中进度条的正确使用?,c++,multithreading,qt,progress-bar,C++,Multithreading,Qt,Progress Bar,我必须通过串行端口发送文件,因此我使用一个单独的线程,名为serialWorker 在主线程中,我有以下内容: ui->progressBar->setMaximum(file.size()); QTextStream in(&file); while(!in.atEnd()){ serialWorker.send(line); ui->progressBar->setValue(in.pos()); } 问题

我必须通过串行端口发送文件,因此我使用一个单独的线程,名为serialWorker

在主线程中,我有以下内容:

ui->progressBar->setMaximum(file.size());    

QTextStream in(&file);
while(!in.atEnd()){

    serialWorker.send(line);  

    ui->progressBar->setValue(in.pos());        

}

问题是进度条不是“实时”的,也就是说,由于serialWorker不阻塞主线程,因此循环运行时不会等待。我应该如何更好地处理这个问题?

您正在更新循环中的进度条,该循环会阻止GUI主线程,因此您的进度条不会得到更新

您应该使用serialWorker中的信号通知用户界面中的进度条进度值。在发送函数中,您应该发出具有适当值的信号。信号如下:

void progressChanged(int val);
还应将progressChanged(int)信号连接到QProgressBar的setValue(int-value)插槽


最后一点是,当send在另一个线程中时,不应该直接调用它。正确的方法是将send定义为一个插槽,并将一个信号连接到该插槽,并在您想要调用send时发出信号。

什么是serialWorker?管理连接的线程。您不能检测到,这个线程何时完成,您的线路何时被处理?它是发出信号还是退出?如果是,那么当线程或行处理完成时,可以增加进度条。好的,我想我可以在完成发送行时发出一个信号。