• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「キャンセル」ボタン付きの処理中ダイアログ)

キャンセルボタン付きの処理中ダイアログ

このQ&Aのポイント
  • Windowsアプリで、ある時間のかかる処理をキャンセルボタン付処理中ダイアログを表示し、途中で処理をキャンセル可能にしたいと考えています。
  • 上記の要件を満たすためには、マルチスレッドを使用する必要があるという過去ログがあります。
  • キャンセルボタンが押された場合は、処理を中断し、ウィンドウを有効にすることができます。

質問者が選んだベストアンサー

  • ベストアンサー
回答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回に付きメッセージ処理を行うため、処理中であっても例えば中断ボタン操作などが普通に処理できます。

kerberos_001
質問者

お礼

ご回答ありがとうございます。 上記のやり方を試したところ、上手く1つのスレッドで処理中の中断が実現できました。ありがとうございました。 ところで、1つのスレッドでキャンセルボタン付ダイアログの表示と処理を並行すると、PCのスペックにも依存すると思いますが、ダイアログのレスポンスがマルチスレッドに比べて遅い気がします。(処理中にダイアログボックスをドラッグ移動しようとすると、多少カクカクします)。もし、呼出し元で画面表示をするスレッドと処理をするスレッド間で、キャンセルボタンの押下判定をするには、スレッド間通信を行うしかないんですかねぇ。

関連するQ&A