1

openSSL コマンド ライン インターフェイスを使用してファイルを暗号化および復号化するための小さな GUI を作成しています。大きなファイルを暗号化/復号化するときに、暗号化の進行状況を表示するプログレス バーが必要です。私はcliインターフェイスを使用しているため、中間の戻り値やこれを支援する他のものはありません。そのため、進行状況を知る唯一の方法は、最初のスレッドがターミナルでopenSSLを呼び出すマルチスレッドプログラムを作成することです

例えば

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

一方、2 番目のスレッドは毎秒出力ファイルのファイル サイズを読み取り、それを元のファイル サイズと比較して進行状況バーの値を計算します。ここでの問題は、スレッドの同期がないことです。そのため、PC がビジー状態の場合、2 番目のスレッドは毎秒実行されないことがよくありますが、最初のスレッドが終了するまで 5 つか 6 つまたは最悪の場合はまったく実行されず、結果は次のようになります。プログレス バーは、暗号化プロセスが終了するまで常にゼロのままです。また、最初のスレッドの優先度を低く設定しようとしましたが、変化が見られませんでした (Linux で Qt5.1 を使用していて、Linux でスレッドの優先度がサポートされていないことをどこかで読んだので、それが理由かもしれません)。

ここで誰かが同じ結果を達成するための他の(できればより良い)方法を私に提案できれば、私は非常に感謝しています..

前もって感謝します

4

2 に答える 2

0

別のプロセスを呼び出してファイルサイズをポーリングするのではなく、openSSL (または同等の) ライブラリを直接使用して、より詳細な進行状況の更新を取得する必要があります (ファイルがフラッシュされる頻度に基づいてのみ更新されます)。

于 2013-09-13T13:22:54.057 に答える
0

使用することをお勧めします

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

openssl は処理情報を standerOutput に出力すると思いますが、readyReadStandardOutput() を使用して、自分で定義した readStdout() をトリガーして、処理情報を取得できます。

于 2013-09-13T13:29:41.307 に答える