うらで何か動作しているとき、キャンセルボタンを押せるようにしたいのですが、
(例えば、Sleep()の間にキャンセルする)
イネーブルにしていても、ボタンが黒く表示されるだけで、押せません。
押せるようにするにはどうしたらいいのでしょうか。
OnTimer()を使っているのですが、それが原因なのでしょうか。

A 回答 (4件)

こんにちは。

itohhといいます。

裏で動いているのは、サーバ通信になる予定なのですね。

わたしの勘違いでした、モーダレス・ダイアログでは、ちょっと対応できない
と思います。

なぜかというと、
モーダレス・ダイアログを使った場合、ダイアログボックスを呼び出す側で
ループによって、ダイアログボックスでボタンが押されたかを監視するのと
裏の処理を行うのを交互に行います。
この場合、裏の処理は、ある程度、細切れに処理を行います。
(例えば、10個のファイルをコピーするとき、1個コピーするたびに
ダイアログボックスのボタンが押下されたかをチェックします。)

今回の場合、サーバ通信は一定時間(Sleep関数のように)制御が
戻ってこないのですよね、同一スレッドでは、どうしてもサーバ通信を
呼び出したところで止まってしまいます。
(実際は、サーバ通信内で動いていますが)
このままだと、ダイアログボックスのボタンが押下することは出来ません。

対策としては、
1.toysmithさんが回答しているように、別スレッドにする。
2.サーバ通信内でたまに制御を戻すようにする。
です。

別スレッドにするメリットですが、中止するためのダイアログボックスと
実際の処理(裏で動いている)を完全に分離できるため制御が
シンプルになります。

対策2で行った場合、スレッドの制御はなくなりますが、
サーバ通信を一定間隔で呼び出し元に制御を戻さなくてはいけないため、
サーバ通信のロジックが難しくなります。

残念ながら、わたしの勘違いです、ごめんなさい。(モーダレス・ダイアログを使うこと)
王道は、対策1がベストだと思います。
    • good
    • 0
この回答へのお礼

早速試してみたのですが、(モーダレスの場合)
うまくいかなかったので、今、「別スレッドで立ち上げる」に挑戦中です。
回答ありがとうございました。

お礼日時:2001/07/02 14:48

「OnTimer()を使っている」というと…


・ダイアログでキャンセルボタン表示
・OnTimer()で呼び出される関数で別の処理を行っている
という状況でしょうか?

この状況ならボタンは有効に動作するはずです(経験済み)。

より、実際的には
1.モーダルダイアログボックスでキャンセルボタンを表示
2.別スレッドで“裏”の処理を行う
3.キャンセルされたら“裏”処理のスレッド殺す
という手順の方が確実に動作します。

この回答への補足

上記の通りです。
OnTimer()内で呼び出される関数が同クラス内にあっても、上記のように動くのでしょうか。
スレッドの使い方がわからないのと、時間がないことで、
スレッドを使わずに作りたいのですが、
補足などありましたらお願いします。

補足日時:2001/07/02 11:46
    • good
    • 0
この回答へのお礼

別スレッドで裏の処理を行うようにしました。
結構、難しいでしたが、なんとか動くようになりました。
ありがとうございました。

お礼日時:2001/07/02 18:30

こんにちは。

itohhといいます。

ちょっと、状況があいまいなので。
1.裏で処理を行っている。(Sleep関数、なんのために??)
2.裏で行っている処理を途中で中断できるようにキャンセルボタン付きの
  ダイアログボックスを表示している。
3.ダイアログボックスのキャンセルボタンが押下できない。
4.裏で処理といっても別プロセス、別スレッドではない。
5.ダイアログボックスを表示したあと、裏の処理が動き出す。
  (OnInitDialog関数内で実行している)
6.MS VC++である。

状況は、これでよいでしょうか?違っていたら、補足願います。
とりあえず、これだと解釈して回答します。

ダイアログボックスの作成方法はどうしていますか?
CDialogクラスのDoModal関数を使っている場合、裏で処理を行っていると
ダイアログボックスの動きは止まりますよ。

基本は、モーダレスでダイアログボックスを作成してください。
そして、キャンセルボタンが押下されたら、裏の処理を中断するように
プログラムを作成してください。

モーダル・ダイアログボックス:CDialogクラスのDoModal関数
モーダレス・ダイアログボックス:CDialogクラスのCreate関数

この回答への補足

ありがとうございます。
Sleep関数の部分は本来ならば、サーバと通信の部分ですが、ダミーでSleepを使っているだけです。

他の部分はおっしゃる通りの状況です。
Create関数を使ってみたいと思うのですが、使い方がいまいちわかりません。
詳しく教えていただけませんでしょうか。

補足日時:2001/07/02 11:32
    • good
    • 1

言語はCですか?C++ですか?それともVC++?



VC++ならSleepExという関数があるのは知っていますが
C++とかCとかだったらどうだったかな?
#ご存じの方、フォローよろしく。

ではでは☆
    • good
    • 0
この回答へのお礼

VC++でした。
回答ありがとうございました。

お礼日時:2001/07/02 11:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング