プログレスバーを持つすべてのプログラムが、操作 (およびプログラムの作業の全処理) が完了するまでにかかる時間をほぼ正確に把握し、それをプログレスバーにマッピングできるようにする方法を常に考えていました。
C# では、プログレス バーを扱うときに常に困難に直面します。これに対する一般的な解決策はないという結論に達しましたね。
私はこれを求めていません:
「たとえば、ファイルの読み取りにかかる時間をどのように知ることができFile.ReadAllBytes(path)
ますか? シンプルです。その前にストップウォッチを開始し、その後停止して時間を読み取ります。しかし、それはコンピューター、CPU、ディスク上だけです! - 1MB の読み取り値は、お使いのマシンや他のマシンとはほとんど異なります。」
内部に入る前に、物事が完了するのに必要な時間をどのように知ることができますか? File.ReadAllBytes()
つまり、メソッドの実行中に進行状況バーがそれに応じてステップできるように、実行される前にどれくらいの時間がかかるかを知る必要があります。
これを行う愚かな方法の 1 つは、2 回行うことです。操作を開始して時間を計算し、再度実行するのですが、今度はプログレスバーをステップさせます(笑)
複雑さがこれと関係があるかどうかはわかりません。定義済みの関数を扱うときではなく、独自のメソッドや関数を記述するときに big-O を使用します。
編集: ほんの一例: ファイルを XOR し、XOR された形式で上書きするプログラムを作成しました。これには、ファイルのバイトをバイト配列に読み取る 1 が含まれます。それらを2-XORします。3-それらをファイルに再度書き込みます。進行状況バーを使用したい場合、これらの操作にかかる時間を知るにはどうすればよいでしょうか? それに応じて進行状況バーを増加させることができます。
これに対する私の解決策は、グローバル変数(prgBarなど)を使用し、XORを別のスレッドに割り当て、ファイルから読み取ったバイト配列からバイトをXORするたびにそのスレッドで「prgBar」をインクリメントすることでした。メインスレッドでは、タイマーを使用しましたが、ティックごとにタイマーを使用しました。prgressBar.Value = prgBar
これには問題があり、正確ではありません。開始が遅れる可能性があります。