No.2
- 回答日時:
こんにちは。
itohhといいます。ちょっと、状況があいまいなので。
1.裏で処理を行っている。(Sleep関数、なんのために??)
2.裏で行っている処理を途中で中断できるようにキャンセルボタン付きの
ダイアログボックスを表示している。
3.ダイアログボックスのキャンセルボタンが押下できない。
4.裏で処理といっても別プロセス、別スレッドではない。
5.ダイアログボックスを表示したあと、裏の処理が動き出す。
(OnInitDialog関数内で実行している)
6.MS VC++である。
状況は、これでよいでしょうか?違っていたら、補足願います。
とりあえず、これだと解釈して回答します。
ダイアログボックスの作成方法はどうしていますか?
CDialogクラスのDoModal関数を使っている場合、裏で処理を行っていると
ダイアログボックスの動きは止まりますよ。
基本は、モーダレスでダイアログボックスを作成してください。
そして、キャンセルボタンが押下されたら、裏の処理を中断するように
プログラムを作成してください。
モーダル・ダイアログボックス:CDialogクラスのDoModal関数
モーダレス・ダイアログボックス:CDialogクラスのCreate関数
この回答への補足
ありがとうございます。
Sleep関数の部分は本来ならば、サーバと通信の部分ですが、ダミーでSleepを使っているだけです。
他の部分はおっしゃる通りの状況です。
Create関数を使ってみたいと思うのですが、使い方がいまいちわかりません。
詳しく教えていただけませんでしょうか。
No.3
- 回答日時:
「OnTimer()を使っている」というと…
・ダイアログでキャンセルボタン表示
・OnTimer()で呼び出される関数で別の処理を行っている
という状況でしょうか?
この状況ならボタンは有効に動作するはずです(経験済み)。
より、実際的には
1.モーダルダイアログボックスでキャンセルボタンを表示
2.別スレッドで“裏”の処理を行う
3.キャンセルされたら“裏”処理のスレッド殺す
という手順の方が確実に動作します。
この回答への補足
上記の通りです。
OnTimer()内で呼び出される関数が同クラス内にあっても、上記のように動くのでしょうか。
スレッドの使い方がわからないのと、時間がないことで、
スレッドを使わずに作りたいのですが、
補足などありましたらお願いします。
No.4ベストアンサー
- 回答日時:
こんにちは。
itohhといいます。裏で動いているのは、サーバ通信になる予定なのですね。
わたしの勘違いでした、モーダレス・ダイアログでは、ちょっと対応できない
と思います。
なぜかというと、
モーダレス・ダイアログを使った場合、ダイアログボックスを呼び出す側で
ループによって、ダイアログボックスでボタンが押されたかを監視するのと
裏の処理を行うのを交互に行います。
この場合、裏の処理は、ある程度、細切れに処理を行います。
(例えば、10個のファイルをコピーするとき、1個コピーするたびに
ダイアログボックスのボタンが押下されたかをチェックします。)
今回の場合、サーバ通信は一定時間(Sleep関数のように)制御が
戻ってこないのですよね、同一スレッドでは、どうしてもサーバ通信を
呼び出したところで止まってしまいます。
(実際は、サーバ通信内で動いていますが)
このままだと、ダイアログボックスのボタンが押下することは出来ません。
対策としては、
1.toysmithさんが回答しているように、別スレッドにする。
2.サーバ通信内でたまに制御を戻すようにする。
です。
別スレッドにするメリットですが、中止するためのダイアログボックスと
実際の処理(裏で動いている)を完全に分離できるため制御が
シンプルになります。
対策2で行った場合、スレッドの制御はなくなりますが、
サーバ通信を一定間隔で呼び出し元に制御を戻さなくてはいけないため、
サーバ通信のロジックが難しくなります。
残念ながら、わたしの勘違いです、ごめんなさい。(モーダレス・ダイアログを使うこと)
王道は、対策1がベストだと思います。
早速試してみたのですが、(モーダレスの場合)
うまくいかなかったので、今、「別スレッドで立ち上げる」に挑戦中です。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- YouTube AmazonファイバースティックってYouTube見る 1 2022/08/30 20:28
- iPhone(アイフォーン) iPhone8使ってますか時々電源が勝手にオフになりますゲームなどしてる時、ホームボタン、電源ボタン 1 2023/02/23 03:44
- メルカリ メルカリについて至急回答希望です 出品したものが売れて 商品発送後 不備があったみたいで 使えないと 1 2023/03/15 17:45
- Windows 10 パソコンが電源ボタンを入れた後起動前必ず一回切れる 6 2022/09/23 11:24
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- その他(悩み相談・人生相談) 誤ってゲイビの再生ボタンを押したら… 1 2022/04/02 23:54
- その他(暮らし・生活・行事) うちの父側の家族みんな、未だにタブレット端末とスマホ、SNSを使ったことがありません。 ※父は除く 6 2023/07/31 08:53
- その他(生活家電) テレビリモコンのボタン修理 6 2022/05/02 22:30
- JavaScript jsで診断コンテンツのページ内切り替えについて 1 2023/04/14 17:31
- gooブログ Twitterの動画画面をgooブログに埋め込めない 4 2022/06/03 16:40
関連するカテゴリから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
-
「キャンセル」ボタン付きの処...
おすすめ情報