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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
ループからの抜け出し方
C言語・C++・C#
-
ボタンが押された時にループから抜けるには
C言語・C++・C#
-
C# 計算処理中に実行中ウィンドウを表示させたい。
C言語・C++・C#
-
-
4
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
5
CString から LPCTSTRの型に変換
C言語・C++・C#
-
6
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
7
処理をとめるキャンセルボタンのあるダイアログ作成
C言語・C++・C#
-
8
コンボボックスのドロップダウンリストが表示されない
C言語・C++・C#
-
9
メッセージハンドラ
C言語・C++・C#
-
10
SetWindowTextについて。
C言語・C++・C#
-
11
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
Stack around the variable 'xx...
-
【KeyDown】キーコードについて
-
Loopとフリーズ
-
My Documentsディレクトリを
-
エクセルVBAでクリップボード内...
-
[VC++] AfxBeginThreadで生成し...
-
VBSの処理中一旦処理を止めて再...
-
WEB上にボタンが押せない
-
C#でチェックボックスボタンで...
-
結果待ちの関数を強制終了
-
vb.netでバッチ処理
-
ASP VBScriptでスクリプト実行...
-
VBA kernel32 の意味
-
B列に特定の文字列が入っている...
-
VBSで応答不要のメッセージボッ...
-
【C#】 あるイベントから別イ...
-
thunderbirdのメッセージフィル...
-
エディットコントロールへの表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
ACCESS側からEXCELの書式を設定...
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
Excel VBA 自動的に閉じるMsgBox
-
VBA、UserFormを前面に出力して...
-
ASP.NETでのメッセージ画面を出...
-
マウスのクリックを無視したい
-
EXCEL VBA「Application.Displa...
-
B列に特定の文字列が入っている...
-
MFCのワーカースレッドとUIスレ...
-
VCでウエイトをミリ秒でかけ...
-
DoEvents
-
「キャンセル」ボタン付きの処...
おすすめ情報