- PR -

VC6.0MFC:無限LOOPから脱出できません

1
投稿者投稿内容
砂嵐ジバ
常連さん
会議室デビュー日: 2005/12/03
投稿数: 25
投稿日時: 2005-12-26 00:11
void CMyView:nSomeCommand()
{
BeginWaitCursor();

while(!kbhit())//実行は出来ますが無限LOOPです!
; //ここをどのように変更すればいいですか?

EndWaitCursor();
}
つまり
やりたいことは、何かキー入力で脱出したいのです。
Ctrl + Alt + Delete では、可能でしたが・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-26 01:11
kbhit って DOS 窓でしか使えないんじゃなかったでしたっけ?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-12-26 11:15
引用:

じゃんぬねっとさんの書き込み (2005-12-26 01:11) より:
kbhit って DOS 窓でしか使えないんじゃなかったでしたっけ?


確かに標準コンソールが存在しない状態では、コンソール入出力関数を使うことは出来ないでしょうね。

Windows APIで同様のことを行いたいなら、GetKeyboardState APIになるのかな。でもこの場合には設計をもう一度考えてみたほうが良いと思う。処理をスレッドとしてGUIから分離するなり、メッセージボックスを表示するなり、Windowsらしいやり方が他にあるはずですから。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-12-27 01:48
PeekMessage() でウィンドウメッセージを取得して、
WM_KEYDOWNだったらキーが押されたイベントだから処理中止、
それ以外だったら、メッセージを処理してやる。
というのが基本です。
(詳細は、PeekMessageでググれば見つかるでしょう)

ただし、メッセージポンプを何箇所にも記述するのは妙なバグの原因になりやすいです。
(1) 重い処理そのものは、別スレッドに分離する。
(2) WindowかViewの、WM_KEYDOWNイベントハンドラで処理中止フラグを立てる。
(3) 処理スレッドでフラグをチェックして処理を中断する。
という構造の方が綺麗に行く場合も多いので、どちらを選ぶか慎重に考えるべきかと。
砂嵐ジバ
常連さん
会議室デビュー日: 2005/12/03
投稿数: 25
投稿日時: 2006-02-09 00:53
スレッドで解決しました
方法はいくつかあるみたいですね!
皆様、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)