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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
【お題】・忍者がやってるYouTubeが炎上してしまった理由
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
コーピングについて教えてください
皆さんはストレスを感じたとき、どのような方法や手段、テクニックで対処していますか?
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
ボタンが押された時にループから抜けるには
C言語・C++・C#
-
ループからの抜け出し方
C言語・C++・C#
-
処理をとめるキャンセルボタンのあるダイアログ作成
C言語・C++・C#
-
-
4
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
5
エディットボックスの入力制限について
C言語・C++・C#
-
6
SetDlgItemTextの使い方について
C言語・C++・C#
-
7
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
8
ダイアログの表示位置の保存
C言語・C++・C#
-
9
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
10
CString から LPCTSTRの型に変換
C言語・C++・C#
-
11
charからLPTSTRへの変換方法
C言語・C++・C#
-
12
CWnd::EnableWindow()の扱い方
C言語・C++・C#
-
13
マウス・キーボード入力を禁止させたい。
C言語・C++・C#
-
14
エディットボックスのテキストが表示されないのはなぜですか
C言語・C++・C#
-
15
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
16
for文実行中を途中で中断するには?
C言語・C++・C#
-
17
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
18
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
19
【MFC】キャンセルボタン処理が実装できない
C言語・C++・C#
-
20
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
ACCESS側からEXCELの書式を設定...
-
エクセルVBAでクリップボード内...
-
メッセージボックスのボタン名変更
-
ファンクションキーのキャンセ...
-
「キャンセル」ボタン付きの処...
-
VBA kernel32 の意味
-
VB.NET開発(イベントプロシー...
-
CreateCompatibleDCを初期化時...
-
access 確認メッセージのはい/...
-
SendMessage中のメッセージ・ル...
-
Excel VBA で処理中断(DoEvents...
-
VCでウエイトをミリ秒でかけ...
-
VBA、UserFormを前面に出力して...
-
Excel(VBA)シート上のコマンド...
-
左シングルクリックとダブルク...
-
[VC++] AfxBeginThreadで生成し...
-
vb.net イベントが完全に終了...
-
VB6でフォームをリロードしたい
-
ループを使わずに、特定時間に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
ACCESS側からEXCELの書式を設定...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
Application.ScreenUpdating=Fa...
-
VBA、UserFormを前面に出力して...
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
Excel VBA で処理中断(DoEvents...
-
「キャンセル」ボタン付きの処...
-
PostMessageの連続送信
-
エクセルVBAでクリップボード内...
-
Excel VBA 実行中に一瞬フリー...
-
【C#】 あるイベントから別イ...
-
MFCのワーカースレッドとUIスレ...
-
VB6でフォームをリロードしたい
-
【MFC】イベントの無効化について
-
Excelのワークシートに行を挿入...
-
ボタンが押された事を検知する...
-
VCでウエイトをミリ秒でかけ...
おすすめ情報