C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[18]: VistaとWaitForSingleObjectについて [1]


(過去ログ 76 を表示中)

[トピック内 25 記事 (21 - 25 表示)]  << 0 | 1 >>

■44761 / inTopicNo.21)  Re[14]: VistaとWaitForSingleObjectについて
  
□投稿者/ とっちゃん (443回)-(2009/12/17(Thu) 11:36:07)
とっちゃん さんの Web サイト
テストアプリなら...

ダイアログアプリ(MFCでもいいし、Generic でもいい)を作成し
ボタンハンドラで
nTimerID = SetTimer(...);
EnableWindow( FALSE );
としておいて
WM_TIMER(OnTimer)で該当IDが来たら
EnableWindow(TRUE);
とすることで、メッセージを処理しつつ、10秒間何もできない状態を実現できます。

該当部分の部分コードを載せますね。


// ボタンハンドラ(一定時間無効状態をテストするための開始ボタン)
void CDisableBtnDlg::OnBnClickedButton1()
{
  ASSERT( m_nTimer == 0 );
  m_nTimer = SetTimer( IDC_BUTTON1, 10*1000, NULL );
  if( m_nTimer != 0 ){
    EnableWindow( FALSE );
  }
}
// 時間が経過したことを取得するためのタイマーメッセージ
void CDisableBtnDlg::OnTimer(UINT_PTR nIDEvent)
{
  if( m_nTimer == nIDEvent ){
    KillTimer( m_nTimer );
    m_nTimer = 0;
    EnableWindow( TRUE );
  }
  else{
    CDialog::OnTimer(nIDEvent);
  }
}
こんな感じ(MFCのダイアログアプリですが)。
#m_nTimer は、クラスメンバーとして追加しています。

ほかの部分は自分で補完してください。

引用返信 編集キー/
■44769 / inTopicNo.22)  Re[15]: VistaとWaitForSingleObjectについて
□投稿者/ kashi (10回)-(2009/12/17(Thu) 15:29:03)
2009/12/17(Thu) 15:34:38 編集(投稿者)

最終的な確認はこれからですが、うまくいきそうです。

まず、WaitForSingleObjectはどうしても共通化されている部分で他のアプリにも影響が出るので
使用するしかなく、タイマーも他のロジックで使用しているのでうかつに追加や起動間隔を変更できず
WaitForSingleObjectを含めた子画面EXEコールルーチン&待機処理を別スレッドにしました。
その上でメインスレッドではここがイマイチ自信がないのですが、

EnableWindow(FALSE);

while(1)
{
Sleep(3000);

if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
GetMessage(&msg, NULL, 0, 0);
}else{
WaitMessage();
}

if(WaitForSingleObject(別スレッド, 0) != WAIT_TIMEOUT){
break;
}
}

EnableWindow(TRUE);

のようにして子画面起動中はメッセージをコントロール?して親画面へのアクションを抑制できたように
今のところ動いてはいます。(危険なロジックでしたらご指摘いただければ幸いです)
テストプログラムで色々試して少しだけ動きがわかったような気がします・・・
また、念のためレジストリに
HungAppTimeoutをXPの標準と同じ5秒で追加しています。→この後削除した場合の動きをさらに確認するつもりです。

引用返信 編集キー/
■44772 / inTopicNo.23)  Re[16]: VistaとWaitForSingleObjectについて
□投稿者/ とっちゃん (444回)-(2009/12/17(Thu) 15:57:40)
とっちゃん さんの Web サイト
No44769 (kashi さん) に返信

> まず、WaitForSingleObjectはどうしても共通化されている部分で他のアプリにも影響が出るので
> 使用するしかなく、タイマーも他のロジックで使用しているのでうかつに追加や起動間隔を変更できず
> WaitForSingleObjectを含めた子画面EXEコールルーチン&待機処理を別スレッドにしました。
> その上でメインスレッドではここがイマイチ自信がないのですが、
> 
子画面EXEのの待機処理とスレッド待機処理だと二重に待つことになりませんか?
というか、GetMessage() しただけではだめで、そのあとの処理を入れないと意味がありません。

ということで、面倒になってきたので具体的なコードw

HANDLE hChildApp; // CreateProcess したプロセスのハンドル(スレッドハンドルはあらかじめCloseしておく)

EnableWindow( FALSE );
bool bLoop = true;
while( bLoop ){
  DWORD dwResult = ::MsgWaitForMultipleObjects( 1, &hChildApp, FALSE, INFINITE, QS_ALLINPUTS );
  switch( dwResult ){
    case WAIT_OBJECT_0+1: // メッセージが来た
      {
        MSG msg;
        // MFCの場合
        while( ::PeekMessage( &msg, 0, 0, PM_NOREMOVE ) ){
          AfxGetApp()->PumpMessage();
        }
      }
      break;
    case WAIT_OBJECT_0: // アプリ終了
      bLoop = false;
      CloseHandle( hChildApp );
      break;
  }
}
EnableWindow( TRUE );

と、こういう感じのコードになります(MFCを使ってない場合はメッセージのループ処理だけ変更すること)。
もし、MFC を使っていない場合は、WinMainにあるメッセージループ(GetMessage() -> DispatchMessage()の段取り)を
コピーしてきてください。


引用返信 編集キー/
■44775 / inTopicNo.24)  Re[17]: VistaとWaitForSingleObjectについて
□投稿者/ kashi (11回)-(2009/12/17(Thu) 17:13:34)
No44772 (とっちゃん さん) に返信
> ■No44769 (kashi さん) に返信
>
>>まず、WaitForSingleObjectはどうしても共通化されている部分で他のアプリにも影響が出るので
>>使用するしかなく、タイマーも他のロジックで使用しているのでうかつに追加や起動間隔を変更できず
>>WaitForSingleObjectを含めた子画面EXEコールルーチン&待機処理を別スレッドにしました。
>>その上でメインスレッドではここがイマイチ自信がないのですが、
>>
> 子画面EXEのの待機処理とスレッド待機処理だと二重に待つことになりませんか?
> というか、GetMessage() しただけではだめで、そのあとの処理を入れないと意味がありません。
>
> ということで、面倒になってきたので具体的なコードw
>
> HANDLE hChildApp; // CreateProcess したプロセスのハンドル(スレッドハンドルはあらかじめCloseしておく)
>
> EnableWindow( FALSE );
> bool bLoop = true;
> while( bLoop ){
> DWORD dwResult = ::MsgWaitForMultipleObjects( 1, &hChildApp, FALSE, INFINITE, QS_ALLINPUTS );
> switch( dwResult ){
> case WAIT_OBJECT_0+1: // メッセージが来た
> {
> MSG msg;
> // MFCの場合
> while( ::PeekMessage( &msg, 0, 0, PM_NOREMOVE ) ){
> AfxGetApp()->PumpMessage();
> }
> }
> break;
> case WAIT_OBJECT_0: // アプリ終了
> bLoop = false;
> CloseHandle( hChildApp );
> break;
> }
> }
> EnableWindow( TRUE );
>
> と、こういう感じのコードになります(MFCを使ってない場合はメッセージのループ処理だけ変更すること)。
> もし、MFC を使っていない場合は、WinMainにあるメッセージループ(GetMessage() -> DispatchMessage()の段取り)を
> コピーしてきてください。

MFCを使用しているのでそのまま利用できました。動作も私の希望通りです・・・
エラー処理など追加すればアプリとしては十分な形になります。
とても助かりましたただただ感謝です。ありがとうございました。
引用返信 編集キー/
■44817 / inTopicNo.25)  Re[18]: VistaとWaitForSingleObjectについて
□投稿者/ kashi (12回)-(2009/12/18(Fri) 14:44:56)
解決済みチェック漏れました・・・
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -