Qt中的多线程

Multithreading in Qt

本文关键字:多线程 Qt      更新时间:2023-10-16

我正在编写一个小的GUI来使用openSSL命令行界面加密和解密文件。我需要一个进度条来显示加密/解密大文件时的加密进度。由于我使用 cli 接口,因此没有中间返回值或其他帮助我,因此我发现了解进度的唯一方法是编写一个多线程程序,其中第一个线程在终端中调用 openSSL

例如

system("openssl aes-256-cbc -in clear_text_file -out encrypted_file")

而第二个线程每秒读取输出文件的文件大小,并将其与原始文件大小进行比较会计算进度条值。这里的问题是没有线程同步,所以当 pc 繁忙时,第二个线程通常不会每秒执行一次,而是每隔五六个或更糟的情况根本不执行,直到第一个线程结束,结果是进度条始终保持为零,直到加密过程结束。我还尝试将第一个线程的优先级设置为低,但我注意到没有变化(我在 Linux 上使用 Qt5.1,我在某处读到不支持 Linux 中的线程优先级,所以这可能是原因)。

如果这里有人能建议我其他(最好是更好)的方式来获得相同的结果,我将不胜感激。

提前谢谢你

您可能需要直接使用 openSSL(或等效)库来获取更精细的进度更新,而不是通过调用单独的进程和轮询文件大小(仅根据文件的刷新频率进行更新)

我建议你使用

proc = new QProcess();
proc.start("openssl aes-256-cbc -in clear_text_file -out encrypted_file");
connect(proc,SIGNAL(readyReadStandardOutput()),this,SLOT(readStdout()));

我认为openssl会有处理信息输出到标准输出,你可以使用readyReadStandardOutput() 到 tigger readStdout() 由您自己定义以获取处理信息。