![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
下記の処理で0ボタンを押すとループ処理を抜ける処理をしたいのです。
その際、キーが押されて無い場合キー入力取得の所で停止させ、押された瞬間動き始めるプログラムを組みたいのですが、出来るのでしょうか?
const BYTE *keys;
for( int i = 0; i == 0; i )
{
// キー入力の取得
keys = iGetKey();
// 0キーはキャンセル
if( keys['0'] & 0x80 )
{
break;
}
}
開発環境
VisualStudio2008 C++ SP1
Platform SDK(多分最新)
DirectX SDK(多分最新)
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんばんは。
キー入力待ちのスレッドを作成して、0が押されたらスレッドから抜け出せば良いのではないでしょうか。
更に前後を見ないと名言は出来ないのですが、スレッドを使用した時、場合によってはクリティカルセクション等による排他処理が必要になります。
とても取り扱いの面倒な物ですので、クラスに丸め込んだ方が楽です。
アラもあるとは思いますが、以下参考程度に(テストはしていません)。
//クリティカルセクションを丸め込む
struct CCS
{
CCS(){::CreateCriticalSection(&m_cs); }
~CCS(){ ::DeleteCriticalSection(&m_cs); }
LPCRITICAL_SECTION Get(){ return &m_cs; }
const LPCRITICAL_SECTION Get() const { return &m_cs; }
private:
CCS(const CCS&);
CCS& operator = (const CCS&);
CRITICAL_SECTION m_cs;
};
//排他ロックをかける動作を丸め込む
struct CLock
{
explicit CLock(CCS* pccs) : m_pccs(pccs)
{ ::EnterCriticalSection(m_pccs->Get());}
~CLock()
{ ::LeaveCriticalSection(m_pccs->Get()); }
private:
CCS* m_pccs;
};
//必要であれば前もってクリティカルセクションを作成しておく
CCS g_ccs;
//キー入力待ちスレッド
DWORD WINAPI ThreadKeyWait(LPVOID p)
{
CCS* pccs = static_cast<CCS*>(p);
while(1)
{
//必要であれば排他ロックのオブジェクトを作成する
CLock lockObject(pccs);
// キー入力の取得
const BYTE *keys = iGetKey();
// 0キーはキャンセル
if( keys['0'] & 0x80 )
{
break;
}
}
}
止めたい場所で、
DWORD dwThreadId;
//スレッドを作成する
HANDLE hThread = ::CreateThread(NULL, 0, &::ThreadKeyWait, &g_ccs, 0, &dwThreadId);
//ココで停止する。0キーが押されると、下に落ちる筈
::WaitForSingleObject(hThread, INFINITE);
//スレッドを消す
::CloseHandle(hThread);
と、言った具合でしょうか・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) プリントスクリーンについて 6 2022/11/23 11:17
- フリーソフト 1秒毎にキーの←を押すソフト 1 2023/03/06 04:27
- Word(ワード) IMEパッドがショートカットキーで開かないのですが。。。 5 2023/06/11 09:23
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- マウス・キーボード プリントスクリーンのボタンがMX Keyboard にありますが、ボタンが反応していないのか、保存さ 3 2022/05/31 10:39
- Windows 10 エクスプローラで希望の場所が表示できない 2 2023/06/29 15:19
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- Mac OS mac os xの設定の(起動ディスク)にブート用dvdが表示されません 1 2022/05/28 13:29
- 国産車 プリウスのエンジンが掛からなくなりました。 20プリウス乗ってます。走行は12万キロに近いです。 ボ 1 2023/03/31 00:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
pthread_mutex_lock の応答時間
-
メインスレッドのPostMessageと...
-
スレッドの安全な終了のさせ方
-
Win32APIでのスレッド処理
-
スレッドの監視方法について
-
WaitForSingleObjectの使い方に...
-
スレッドの終了の仕方
-
スレッドがサスペンドされてい...
-
C# スレッド終了の監視について
-
別スレッドからメインダイアロ...
-
スレッド終了を待つ間に開放さ...
-
DirectX キーが入力されるまで...
-
C言語で一定時間待機後、再実行
-
Windows上で、シグナル(SIGTERM...
-
頭冷やし終えました。スクリー...
-
pthread_cond_wait 取りこぼし?
-
同一スレッドで、ロックをかけ...
-
スレッド一覧の取得
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
Windows上で、シグナル(SIGTERM...
-
マルチスレッドプログラミング...
-
スレッドの終了の仕方
-
スレッドにて同一メモリの書き...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
スレッドでWM_TIMERを受け取れない
-
同一スレッドで、ロックをかけ...
-
マルチスレッドのスレッド数を...
-
WaitForMultipleObjectのイベン...
-
MFC通信プログラムマルチスレッ...
-
CWnd::OnTimerのスレッドの取得
-
待機関数(WaitForMultipleObjec...
-
LinuxでDoEvents()同等機能
-
【VC++6.0(MFC)】スレッドの呼...
-
pthread_cond_wait 取りこぼし?
おすすめ情報