ダウンロードの進行状況を大きな数字でバイト単位で表示する Windows プログレスバーを実装しようとしていますが、正しく実行できません。
2.5GB のダウンロードの場合、次のようにすると、ダウンロードが完了すると全範囲を下回って終了します。
double dlSize = getDlSize();
unsigned int pbRange = (unsigned int)( dlSize / 3000 );
SendMessage( hProgressbar, PBM_SETRANGE, 0, MAKELPARAM( 0, pbRange ) );
次に、各ダウンロード コールバックで新しい位置を次のように設定します。
double dlBytes = bytesDownloaded();
unsigned int newIncrement = (unsigned int)( dlBytes / 3000 );
SendMessage( hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0 );
これは非常に初心者の実装であり、xy の状況に陥りたくないので、私の質問は、バイト単位で 2 ~ 5 GB の大きな数字を持つプログレスバーを実装する正しい方法は何ですか?
プログレスバーの幅を考慮し、実際の数値の代わりにパーセンテージを使用して、@msandiford と @NikBougalis によって以下に提案された両方のアプローチを試しました。両方を組み合わせましたが、すべての場合で newIncrement は常に 0 になります。 dlSize は常に低くなります (2 倍の newIncrement では 1.15743e+007 のように出力され、型キャストとその 0 が返されます)。
他に何ができますか?
両方のアプローチを組み合わせた新しいコード:
編集 2: newIncrement に対して常に 0 を取得していたため、コードにいくつかのチェックを追加しました。現在は機能しているように見えます。
GetClientRect(hProgressbar, &pbRCClient);
pbWidth = pbRCClient.right - pbRCClient.left; // (pbWidth its a global variable)
unsigned int pbRange = pbRCClient.right - pbRCClient.left;
SendMessage( hProgressbar, PBM_SETRANGE, 0, MAKELPARAM( 0, pbRange ) );
そして更新中:
double dlSize = getDlSize();
double doubleIncrement = ( ( dlSize * pbWidth ) / totalSize );
unsigned int newIncrement;
if ( (unsigned int)doubleIncrement < 1 )
{
blockFill += doubleIncrement;
if ( (unsigned int)blockFill > 1 )
{
newIncrement = ( unsigned int )blockFill;
SendMessage( hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0 );
blockFill = 0;
}
}
else
{
newIncrement = ( unsigned int )( doubleIncrement );
SendMessage( hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0 );
//blockFill = 0;
}
EDIT 3:まだ早く終わっているようです。