Windowsアプリで、ある時間のかかる処理を
キャンセルボタン付処理中ダイアログを表示し、途中で処理をキャンセル可能にしたいと考えています。
ここの過去ログから上記はマルチスレッドにする必要があると拝見しました。http://oshiete1.goo.ne.jp/kotaeru.php3?q=96951
<メイン画面の開始ボタン処理> ------------------
void C_SampleDlg::OnStart(){
CWinThread *cwt;
C_CancelDlg dlgCancel(this);
cwt = AfxBeginThread(Sample_Proc, &InputParams);
cwt->m_bAutoDelete = FALSE;
cwt->ResumeThread();
EnableWindow(FALSE);
dlgCancel.Create();
dlgCancel.ShowWindow(SW_SHOW);
while(TRUE){
if(dlgCancel.CheckCancel() == TRUE){
// キャンセルが押された時
EnableWindow(TRUE);
dRcd = WaitForSingleObject(cwt->m_hThread, INFINITE);
if(dRcd == WAIT_OBJECT_0)
return;
}
dRcd = WaitForSingleObject(cwt->m_hThread, 0);
if(dRcd == WAIT_OBJECT_0){
dlgCancel.DestroyWindow();
EnableWindow(TRUE);
break;
}
}
return;
}
<プロシージャ> ----------------------------------
UINT Sample_Proc(LPVOID pParam){
C_SampleDlg->やりたい処理関数呼び出し
::AfxEndThread(0);
return 0;
}
以降別ソース ==================================
<C_SampleDlg::やりたい処理関数>
↑ここでdlgCancel.CheckCancel() == TRUEかどうか
判定したい場合、グローバル関数を使うか、または呼出し元で作成したインスタンスをパラメタとして渡して使うべきなのでしょうか。文字数の関係で分かりにくいところもありますが、よろしくお願いします。
※dlgCancel.CheckCancel()はC_CancelDlgクラスのプロテクト変数を内部で操作しています。
No.1ベストアンサー
- 回答日時:
時間のかかる処理というのがループして実行するようなタイプの処理だと、マルチスレッド使わなくても以下のような方法で簡単にできます。
時間のかかる処理の中で、キャンセルボタンは普通押せません。それは1メッセージの処理の中で長~い処理を行っているからです。それならば、メッセージ処理中にも別のメッセージを処理できる仕組みを作ってやればいいのです。○ Before
for(int loop=0; loop < 1000000; loop ++) {
// ここで時間のかかる処理実行
}
この場合だとループがすべて終了するまで待たされます。
○ After
for(int loop=0; loop < 1000000; loop ++) {
// ここで時間のかかる処理
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
break;
}
}
ループ1回に付きメッセージ処理を行うため、処理中であっても例えば中断ボタン操作などが普通に処理できます。
ご回答ありがとうございます。
上記のやり方を試したところ、上手く1つのスレッドで処理中の中断が実現できました。ありがとうございました。
ところで、1つのスレッドでキャンセルボタン付ダイアログの表示と処理を並行すると、PCのスペックにも依存すると思いますが、ダイアログのレスポンスがマルチスレッドに比べて遅い気がします。(処理中にダイアログボックスをドラッグ移動しようとすると、多少カクカクします)。もし、呼出し元で画面表示をするスレッドと処理をするスレッド間で、キャンセルボタンの押下判定をするには、スレッド間通信を行うしかないんですかねぇ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
ボタンが押された時にループから抜けるには
C言語・C++・C#
-
ループからの抜け出し方
C言語・C++・C#
-
C# 計算処理中に実行中ウィンドウを表示させたい。
C言語・C++・C#
-
-
4
CString から LPCTSTRの型に変換
C言語・C++・C#
-
5
処理をとめるキャンセルボタンのあるダイアログ作成
C言語・C++・C#
-
6
SetWindowTextについて。
C言語・C++・C#
-
7
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
8
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
Excelのワークシートに行を挿入...
-
メッセージボックスのボタン名変更
-
VBA メッセージボックスを自動...
-
MFCのメニューバーのイベント取得
-
Excel VBA 実行中に一瞬フリー...
-
エクセルが勝手に立ち上がる
-
ACCESS側からEXCELの書式を設定...
-
ASP VBScriptでスクリプト実行...
-
C#で処理中画面を表示したい。
-
「キャンセル」ボタン付きの処...
-
Application.ScreenUpdating=Fa...
-
VBSで応答不要のメッセージボッ...
-
【KeyDown】キーコードについて
-
スロットゲームのプログラミング
-
ASP.NETでのメッセージ画面を出...
-
エクセルVBAでクリップボード内...
-
VB.NETで数秒間msgboxの...
-
[VC++] AfxBeginThreadで生成し...
-
PostMessageの連続送信
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
エクセルVBAでクリップボード内...
-
Application.ScreenUpdating=Fa...
-
Excel VBA で処理中断(DoEvents...
-
VBA メッセージボックスを自動...
-
【C#】 あるイベントから別イ...
-
VBA、UserFormを前面に出力して...
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
スロットゲームのプログラミング
-
キーボード入力、マウス操作を...
-
<input type="file">タグで「キ...
-
Excelのワークシートに行を挿入...
-
ボタンが押された事を検知する...
-
VB6 コマンドボタン クリック...
-
VCでウエイトをミリ秒でかけ...
おすすめ情報