処理経過をプログレスバーに反映させる方法 – プログラミング – Home

処理経過をプログレスバーに反映させる方...
 
通知
すべてクリア

[解決済] 処理経過をプログレスバーに反映させる方法


ひろし
 ひろし
(@ひろし)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

PC環境/OS XPpro MFCv6
MFCの基本的な質問ですが、ビュー側で用意した、プログレスバーにドキュメント側で処
理する経過を反映させたいがうまくいきません。
例えば200MB位のファイルを読み上げる場合、時間がかかるので、その経過をプログレス
バーに反映させる場合などです。
ビュー側では、ボタンコントロールによりドキュメント側の処理の起動とその結果を受
け取るような構造を予定しています。
MFCにおけるドキュメントとビューの役割分担がよく理解できていないため、そのあたり
についても教えていただければありがたいのですが。
宜しくお願いします。


引用未解決
トピックタグ
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

プログレスバーを表示できないのか
プログレスバーが更新されないのか
どのようにしてうまくいかなかったのか
といった事を書くとレスがつきやすいと思います。

[参考になるかな?]
CDocument::UpdateAllViews : でViewに変更を通知
CView::OnUpdate : CDocument::UpdateAllViewsを呼び出した時に呼び出される
(デフォルトでは多分Viewを再描画する処理を呼び出してるだけかな)

DocumentとViewの関連 Observerパターンです


返信引用
ひろし
 ひろし
(@ひろし)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

Kazuki さん指導ありがとうございます。
具体的にはフォームビューにプログレスバーを貼り付けて、View 側でのコントロールに
ついてはうまく処理できます。ドキュメント側からは GetDocument()に相当する関数を
見つけられないため処理できないという意味です。
ビュー側ではスタートボタンに続いて、30程の機能を順番に呼び出す仕組みで、機能の
内容は全てドキュメント側にかかれています。夫々の機能はデータ量により変動するこ
とは当然ですが、3分から20分くらいかかるので、30の機能を確認する全体作業のプログ
レスバーと、夫々の機能内の進捗を表現するプログレスバーとに分けました。
そして、夫々の機能を記述する部分からプログレスバーをコントロールしたいのです
が、その方法を見つけることが出来ない状況です。
機能の多くは読み込んだデータの論理チェック的な内容です。
因みに、CObArry データのソート機能はあるのでしょうか、また、コレクションクラス
の適材適所がよく理解できていません。
今回も30万から50万件程度のデータの論理チェックが目的で、データベースを使うか、
MFCのコレクションクラスを使うか迷った挙句、少なくてもメモリー上に置いた方が早い
だろうとの中で配列クラスを利用しています。1レコードのフィールド数は20から80位
で、シーケンシャルにレコードを読み込んで処理する場合も有りますが、レコードを検
索しながら追跡する機能も用意しています。
参考になるご意見がありましたらお願いします。
当方はソフトウエアを本業としていません。仕事の中で必要に迫られて作成していま
す。
宜しくお願いします。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 とりあえず、AfxGetMainWndと、、、
http://www24.cds.ne.jp/~neg/pro/piyo1/sdimdi/viewp.html


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

Document-Viewアーキテクチャに従うなら、
1)ドキュメントは必要な処理をして自身のメンバ変数を更新する。
2)UpdateAllViewsを呼び出す。
3)各ビューのOnUpdateが呼ばれるので、
ビューはドキュメントから必要な情報を取り出して、画面を更新する。
というようになります。


返信引用
ひろし
 ひろし
(@ひろし)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

ご指導ありがとうございます。
色々試していてどうしても解決できない点があります。
フォームビューの更新がうまくいきません。
例えば
SetDlgItemText(IDC_EDIT_ZUMEN, TEST1);
TEST1処理ロジック
SetDlgItemText(IDC_EDIT_ZUMEN, TEST2);
TEST2処理ロジック
としたとき、SetDlgItemTextが反映しない場合があり、pDoc->UpdateAllViews(NULL);で
も解消しません。(うまく反映するかどうかはコンパイル時に決まっているようです)
どうもシステムは処理ロジックに専念してしまい。手前のエディットボックスの処理な
どを飛ばしてしまいます。
プログレスバーの更新も同様で、処理が飛ばされてしまいます。
雰囲気とすれば、いくつかの処理ロジックが終了した後、フォームビューにコントロー
ルが移ってたとき初めてSetDlgItemTextの処理が反映します。途中でMessageBox等を入
れると、etDlgItemTexが機能します。そのように処理の途中の流れが表現できない状況
です。
ご指導宜しくお願いします。


返信引用
汎
 汎
(@汎)
ゲスト
結合: 22年前
投稿: 43
 

重たいのでこうなるのですね。
時間のかかる処理を別スレッドにして処理させるのが一番よさそうです。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 SetDlgItemText後にそのコントロールに対してUpdateWindowを実行しましょう。

GetDlgItem(IDC_EDIT_ZUMEN)->UpdateWindow();

 キューにメッセージをポストして終了してしまう処理もありますから。


返信引用
ひろし
 ひろし
(@ひろし)
ゲスト
結合: 23年前
投稿: 24
Topic starter  

NEG(ねぐ)さん
解決しました。
このような機能があるとは思っていたんですが、たすかりました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました