シグナル状態 か 非シグナル状態か調べる方法 – プログラミング – Home

シグナル状態 か 非シグナル状態か調べ...
 
通知
すべてクリア

[解決済] シグナル状態 か 非シグナル状態か調べる方法


a.hayashi
 a.hayashi
(@a.hayashi)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

起動した時にスレッドを作成して、ボタンが押されたら処理を行うプログラム
を作成しました。( 下記参照 )

ボタンを押した時に、スレッドは ::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();
//←イベントをシグナル状態にする
}
}


引用未解決
トピックタグ
a.hayashi
 a.hayashi
(@a.hayashi)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

環境は VC++ 6.0 MFC です。

void CThreadTest::OnButton1() /*ボタンクリック*/
{
  /***************************************************************/
/* ここでスレッドがイベント待ちなのか、処理中なのか知りたい。 */
/***************************************************************/

g_Event.SetEvent();

}


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

どうしてそんなことを?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

意味無いと思うけど、ど~してもやりたいなら
「volatile の状態フラグを用意して調べればいいぢゃん」
てのはどうでしょう(なげやり)。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> どうしてそんなことを?
まだ処理が終わってないときに、ボタンが押されたら
  「処理中です」
等のダイアログをユーザーを待たせるようにしたいのでは?

僕なら、グローバル変数を作って、
処理の初めと終わりで値を変えて
>  /***************************************************************/
> /* ここでスレッドがイベント待ちなのか、処理中なのか知りたい。 */
> /***************************************************************/
ここでチェックする。


返信引用
a.hayashi
 a.hayashi
(@a.hayashi)
ゲスト
結合: 16年前
投稿: 7
Topic starter  

>どうしてそんなことを?
>意味無いと思うけど、ど~してもやりたいなら

勘違いをしていました。
意味無い事に気がつきました。

処理中にボタンが押された場合、
g_Event.SetEvent(); を処理しないで飛ばそうと思っていたのですが、
何もしないでも、動作は同じようですね。

どうしてもやりたい場合はフラグを用意してチェックしてみます。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました