電子書籍の厳選無料作品が豊富!

下記の処理で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件)

初心者です。


私の環境(ターボC++)では
char str=0;

while(1)
{
str=getch();
if(str==48)break;
}
    • good
    • 0

 こんばんは。



 キー入力待ちのスレッドを作成して、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);

 と、言った具合でしょうか・・・。
    • good
    • 0

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