テキストベースのプログレスバーについて

解決


がおがお  2004-07-25 06:37:51  No: 54083

こんばんは。  

今、所定のインターネットサーバーにあるデータをhttpプロトコルでダウンロードする。というアプリを作っています。
プログラムサイズの関係で、コモンコントロールのプログレスバーを使うことができないので、スタティックテキストで作りたいと考えいます。

"|" ←の文字を、連ねて  
|||||||||||||||||||||
みたいないう感じで。

インターネットとの通信ではwininetを使い、
forループ(無限ループ)で、
1kバイトずつデータをInternetReadFileで読取、結合を行い
最後に所定のファイル名で保存しています。
・ウインドウを持たないアプリです。
・今、実行ファイルのサイズは10kバイトほどです。
・実行ファイルのサイズはできるだけ、小さくしたいと思います。

このような場合、どのようなタイミングでダイアログにメッセージ処理?
をすればよいのか、わからないです。

現状の読み取り部分のソースは
=====================================================>>>
// このループで読み取る
for(;;) {  
  // バッファ初期化
  wsprintf(cBuf_temp,"%s", "");  
  // データ読み込み
  bret = InternetReadFile(hFile, cBuf_temp, DEF_READ_SIZE,&dwSize);
  // データバイトを足す
  dwExeSize += dwSize;
  // 全て読み込んだ?
  if((bret) && (dwSize == 0))
    // Yes !
    break;
  else 
    //  No.
    //  読み込んだデータを連結
    memcpy( cBufBody + (dwExeSize - dwSize) , cBuf_temp, dwSize );    
}
<<<=====================================================
となっています。

当方、C言語をはじめたばかりで、ほとんど五里霧中な状態です。
よろしくお願いいたします。
こんな方法もあるよ、とか、いろんな方のご意見もお聞きしたいです。


tetrapod  2004-07-26 18:44:16  No: 54084

コンソール ftp.exe の hash on みたいにすればよいのですか?
ftp の hash は 2KB 受信ごとに # を1つ表示しています。これなら簡単。
プログレスバー (%表示) にするには全データサイズが既知である必要がありますね。
これが結構面倒かも。

hash 表示でよいなら受信の度に表示とか。
% 表示がいいなら受信の度に % を計算、プログレスバー表示の必要があれば表示とか。
単純に (%dKB 受信済み) と表示するとか。
あるいは UN*X 系ではメジャーなのですが |/-\ の巡回表示とか。
日本語コンソールでは \ がバックスラッシュにならないので |- の交互表示とか。


がおがお  2004-07-26 19:17:21  No: 54085

tetrapodさん、お返事ありがとうございます。

>コンソール ftp.exe の hash on みたいにすればよいのですか?

書き方がまずくて、申し訳ないです。
ダイアログボックス上に配置されたスタティックテキストコントロールに
プログレスバーを実現したいのです。

>プログレスバー (%表示) にするには全データサイズが
>既知である必要がありますね。

これは、事前に取得することができます。

受信ループ前にダイアログボックスを表示して
受信中は、ダイアログボックスのスタティックテキストを更新
受信ループ終了後にダイアログボックスを消す

といった一連の処理を行いたいのです。
なんとかどうぞよろしくお願いいたします。


がおがお  2004-07-26 19:17:23  No: 54086

tetrapodさん、お返事ありがとうございます。

>コンソール ftp.exe の hash on みたいにすればよいのですか?

書き方がまずくて、申し訳ないです。
ダイアログボックス上に配置されたスタティックテキストコントロールに
プログレスバーを実現したいのです。

>プログレスバー (%表示) にするには全データサイズが
>既知である必要がありますね。

これは、事前に取得することができます。

受信ループ前にダイアログボックスを表示して
受信中は、ダイアログボックスのスタティックテキストを更新
受信ループ終了後にダイアログボックスを消す

といった一連の処理を行いたいのです。
なんとかどうぞよろしくお願いいたします。


tetrapod  2004-07-26 20:23:54  No: 54087

あーっと、コンソールアプリではなくてダイアログベースなのですね。
別に作り方に変わりは無いというか。
InternetReadFile で読むたびに%を計算すればいいのでは?

>受信ループ前にダイアログボックスを表示して
>受信ループ終了後にダイアログボックスを消す
ここは良いとして

>受信中は、ダイアログボックスのスタティックテキストを更新
10% につき | を1つ表示する例。
dwExeSize+=dwSize;
int p=10*dwExeSize/dwTotalExeSize; // 10%
TCHAR buf[16];
_stprintf(buf, _T("%.*s"), p, _T("||||||||||"));
progress_text.SetWindowText(buf);
とかなんとかテキトーにごまかせばよいのではないかと。

受信はワーカスレッドにしないとUIとまっちゃうよ。


がおがお  2004-07-27 07:20:43  No: 54088

tetrapod さん
ありがとうございました。

なんとか実装することができました。
感謝!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加