
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#
-
-
4
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
5
キャンセルの方法
C言語・C++・C#
-
6
画面を強制的に再描画させる方法
C言語・C++・C#
-
7
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
8
ダイアログの表示位置の保存
C言語・C++・C#
-
9
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
10
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
11
CWnd::EnableWindow()の扱い方
C言語・C++・C#
-
12
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
13
ループを途中で抜けたいのですが。
C言語・C++・C#
-
14
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
15
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
16
リストコントロールのデータの変更を検知したい
C言語・C++・C#
-
17
【MFC】キャンセルボタン処理が実装できない
C言語・C++・C#
-
18
エディットボックスの入力制限について
C言語・C++・C#
-
19
別スレッドからメインダイアログのコントロールにアクセスする方法
C言語・C++・C#
-
20
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS側からEXCELの書式を設定...
-
キャンセルの方法
-
Excel VBA 実行中に一瞬フリー...
-
「shift」ボタンが押された時。
-
DirectX環境下での方向キー同時...
-
VBSの処理中一旦処理を止めて再...
-
Excel VBA で処理中断(DoEvents...
-
シャットダウン時のExcel強制終...
-
EXCEL VBA「Application.Displa...
-
VBA kernel32 の意味
-
スタティックテキストが表示さ...
-
メッセージボックスのボタン名変更
-
Application.ScreenUpdating=Fa...
-
CPUを増やすとそれだけ性能があ...
-
MFCのワーカースレッドとUIスレ...
-
for文実行中を途中で中断するに...
-
OSシャットダウン時の常駐アプ...
-
Windowsがシャットダウンする前に
-
VB.NETのUsingキーワードの使い方
-
ボタンが押された事を検知する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
ACCESS側からEXCELの書式を設定...
-
メッセージボックスのボタン名変更
-
VBSで応答不要のメッセージボッ...
-
VBA kernel32 の意味
-
Excel VBA で処理中断(DoEvents...
-
VBA、UserFormを前面に出力して...
-
Application.ScreenUpdating=Fa...
-
MFCのワーカースレッドとUIスレ...
-
ASP.NETでのメッセージ画面を出...
-
「キャンセル」ボタン付きの処...
-
シャットダウン時のExcel強制終...
-
【C#】 あるイベントから別イ...
-
ボタンが押された事を検知する...
-
PostMessageの連続送信
-
VBA メッセージボックスを自動...
-
エクセルVBAでクリップボード内...
-
VCでウエイトをミリ秒でかけ...
-
ループを使わずに、特定時間に...
-
VB6 コマンドボタン クリック...
おすすめ情報