起動した時にスレッドを作成して、ボタンが押されたら処理を行うプログラム
を作成しました。( 下記参照 )
ボタンを押した時に、スレッドは ::WaitForSingleObject( lpHandle , INFINITE );
ここでイベントを待っている状態なのか、処理中なのか調べたいのですが、
アドバイスお願いします。
#include <afxmt.h> /* CEvent ヘッダ */
/* グローバル */
CEvent g_Event; /*イベント*/
HANDLE lpHandle = g_Event; /*イベント ハンドル*/
void CThreadTest::OnButton1() /*ボタンクリック*/
{
g_Event.SetEvent(); /*←イベントをシグナル状態にする*/
}
UINT CThreadTest::Thread(LPVOID pParam) /* スレッド
AfxBeginThread() */
{
CThreadTest *pInst = (CThreadTest *) pParam;
while( pInst->m_ThreadFlag == 1 ){ /* スレッドフラグ */
::WaitForSingleObject( lpHandle , INFINITE ); /* イベント待ち */
/* ↓処理始まり↓ */
/* ↑処理終わり↑ */
}
return 0;
}
このように試してみたのですが、うまく行きませんでした。
void CThreadDlg::OnOnButton1()
{
if ( ::WaitForSingleObject( lpHandle, 0 ) == WAIT_TIMEOUT ){ //試し
たこと
g_Event.SetEvent();
//←イベントをシグナル状態にする
}
}
環境は VC++ 6.0 MFC です。
void CThreadTest::OnButton1() /*ボタンクリック*/
{
/***************************************************************/
/* ここでスレッドがイベント待ちなのか、処理中なのか知りたい。 */
/***************************************************************/
g_Event.SetEvent();
}
どうしてそんなことを?
意味無いと思うけど、ど~してもやりたいなら
「volatile の状態フラグを用意して調べればいいぢゃん」
てのはどうでしょう(なげやり)。
> どうしてそんなことを?
まだ処理が終わってないときに、ボタンが押されたら
「処理中です」
等のダイアログをユーザーを待たせるようにしたいのでは?
僕なら、グローバル変数を作って、
処理の初めと終わりで値を変えて
> /***************************************************************/
> /* ここでスレッドがイベント待ちなのか、処理中なのか知りたい。 */
> /***************************************************************/
ここでチェックする。
>どうしてそんなことを?
>意味無いと思うけど、ど~してもやりたいなら
勘違いをしていました。
意味無い事に気がつきました。
処理中にボタンが押された場合、
g_Event.SetEvent(); を処理しないで飛ばそうと思っていたのですが、
何もしないでも、動作は同じようですね。
どうしてもやりたい場合はフラグを用意してチェックしてみます。
ありがとうございました。