スレッドを作成して、その中で処理をしようと考えています。
ただ、ボタンをクリックするまでCPUにあまり負荷をかけないで、
スレッドの中で待機させていたいのですが、方法がよくわかりません
アドバイスお願いします。
10ms の無駄なタイムアウトを使ったループ無しに
WaitForSingleObject でボタンがクリックされるのをひたすら待っている?
ような方法ができたら良いなと思っています。
よろしくお願いします。
UINT Thread::TestThread(LPVOID pParam) /* 処理スレッド */
{
Thread *pInst = (Thread *) pParam;
/* BOOL m_ThreadFlag スレッド終了用フラグ */
while( pInst->m_ThreadFlag == ON/*1*/ ){
/* 処理スタートボタンがクリックされるまで、待つ */
if(::WaitForSingleObject(pInst->m_Thread->m_hThread,10)==WAIT_TIMEOUT ){
if(pInst->m_ButtonOnFlag != ON ){ /* ボタンクリック? */
continue; /* ボタンがクリックされるのを待つ */
} else {
pInst->m_ButtonOnFlag = OFF; /* フラグクリア*/
}
}
/* ↓処理↓ */
/* ↑処理↑ */
}
return 0;
}
void Thread::OnButton() /* ボタンクリックで呼び出される */
{
m_ButtonOnFlag = ON; /* ボタンがクリックした事を知らせるフラグ */
}
環境の記載忘れです。
VC++ 6.0 MFC です。
イベントを使います。MFC で言うと CEvent でしょうか。
aetos さん ありがとうございます。
アドバイスを参考に改造してみました。
思っていた動作ができていそうです。
ありがとうございます。
CEvent g_Event; //Event1
UINT CThreadDlg::SerialCommunicationThread(LPVOID pParam)
{
CThreadDlg *pInst = (CThreadDlg *) pParam;
HANDLE lpHandle;
lpHandle = g_Event; //イベントハンドルセット
while( pInst->m_ThreadFlag == 1 ){
::WaitForSingleObject( lpHandle , INFINITE );
/* 処理 */
}
return 0;
}
void Thread::OnButton() /* ボタンクリックで呼び出される */
{
g_Event.SetEvent(); //イベント発生通知
}
解決しました。