激凹みから立ち直る方法

初めてのWIN32プログラムでまだウィンドウの制御がちゃんと理解できていない
ため、行き詰まってしまいました。よろしくお願いします。

・やりたい事
メインウィンドウの出力ボタンを押すと、サブウィンドウを表示しプログレス
バーで進捗を表示しつつ出力処理をしたいと考えています。

・状況と問題
プログレスバーのあるサブウィンドウを一切触らなければ、進捗処理が思った
通り表示されて、処理終了後にメインウィンドウに返ってきます。
ですが、サブウィンドウをマウスで移動しようとすると、サブウィンドウが白
っぽくなり(応答なし)、出力処理が終わるまでそのまま待ち状態になってし
まいます(処理が終わればサブウィンドウは破棄されメインウィンドウに戻っ
てきます)。

・質問
たぶん、出力処理が終わるまで、メッセージがキューに溜まってウィンドウが
待ち状態になってしまうのではないかと思っていますが、どうしたら良いかわ
からず、先に進めなくなってしまいました。関数などの処理中に、ウィンドウが
待ち状態にならない方法を教えてください。


サブウィンドウクラスの定義
**********************************************************************
wc.style =0;
wc.lpfnWndProc =SubWndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName =NULL;
wc.lpszClassName="SubWndClass";
**********************************************************************

メインウィンドウプロシジャー
**********************************************************************
~省略~

case WM_COMMAND:

~省略~

hSWnd=CreateWindow("SubWndClass", "処理中", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, ww, hh, hwnd, (HMENU)NULL, 0, 0
); //(1)へ
ShowWindow(hSWnd, SW_SHOW);
FuncA(); //(2)へ
DestroyWindow(hSWnd);
**********************************************************************

(1)サブウィンドウ(オーナー付ウィンドウ)のプロシジャー
**********************************************************************
~省略~

case WM_CREATE:
pb = CreateWindow(PROGRESS_CLASS, "",
WS_CHILD | WS_VISIBLE | WS_BORDER, x, y, 200, 20, hwnd, NULL, 0, NULL
);
SendMessage(pb, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
SendMessage(pb, PBM_SETSTEP, 1, 0);
**********************************************************************

(2)関数A
**********************************************************************
~省略~
for(i=0; i<ct1; i++, p++){
~省略~
if(i%gct == 0) //処理件数を100分割してプログレスバーを増分
SendMessage(pb, PBM_STEPIT, 0, 0);
~省略~
}
**********************************************************************

A 回答 (1件)

>たぶん、出力処理が終わるまで、メッセージがキューに溜まってウィンドウが


>待ち状態になってしまうのではないかと思っていますが、どうしたら良いかわ
>からず、先に進めなくなってしまいました。

・PeekMessage()とループを使って自分でメッセージを回す。
・ワーカースレッド作ってそっちで処理する。

でしょうかね。
お勧めはワーカースレッドですが。
# ただし、同期処理とかちょいと面倒ですけどね。

サブウィンドウ作るとなると…
サブウィンドウのUIスレッド(メッセージループ処理しているスレッド)と、「(2)関数A」を処理するワーカースレッド…でしょうかねぇ。
# 私なら…メインウィンドウからサブウィンドウのUIスレッドを起動、サブウィンドウのWM_CREATE辺りから「(2)関数A」なワーカースレッドを起動…でしょうかね。

ちょいと内容が古いですが…
http://www.kumei.ne.jp/c_lang/sdk/sdk_87.htm
とか。
(この後の章でもやっていますので続けて見た方がいいかもしれません)


PeekMessage()だと
http://capsulecorp.studio-web.net/tora9/c/api/Fi …
とかに例がありますかね。
# 後半、タイマーになってますが…。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
教えてもらったどちらかの方法でやってみます。
まずワーカースレッドの方を調べてみます。
また質問させてもらうかも知れません。お時間がありましたら回答お願いします。

お礼日時:2012/05/01 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!