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

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

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

Re[3]: 別プロセスの実行


(過去ログ 107 を表示中)

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

■63803 / inTopicNo.1)  別プロセスの実行
  
□投稿者/ リュウスケ (1回)-(2012/10/12(Fri) 17:12:26)

分類:[C/C++] 

Windows XP
Visual Stdio2010
C++

あるアプリからボタン押下で
別アプリを起動したいと思っています。
/* アプリ実行 */
if(0 != CreateProcess(NULL,(LPTSTR)tcPath,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
{
  // アプリが終了するまで待つ
  CloseHandle(pi.hThread);※1
  WaitForSingleObject(pi.hProcess,INFINITE);
  CloseHandle(pi.hProcess);※2
}

質問したいのは※部分についてです。
@※2は別プロセスのハンドラをクローズしていると思うのですが
 ※1が何のハンドラをくろーずしているのかがわかりません。
A※1は必要なのでしょうか?
Bサイトによって書く位置が異なるのですが、どれが正しいのでしょうか?
 例1)
  CloseHandle(pi.hThread);
  WaitForSingleObject(pi.hProcess,INFINITE);
  CloseHandle(pi.hProcess);
 例2)
  WaitForSingleObject(pi.hProcess,INFINITE);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
 例3)
  WaitForSingleObject(pi.hProcess,INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);

以上、よろしくお願いいたします。
引用返信 編集キー/
■63805 / inTopicNo.2)  Re[1]: 別プロセスの実行
□投稿者/ 774RR (4回)-(2012/10/12(Fri) 17:56:12)
まず、そのコードをボタンのハンドラ関数にて既述していないか確認。
メッセージループ (UI スレッド) を WaitFor*** で停止させてはいけないぞ。

1. プロセスとは、1つ以上のスレッドから構成されるものだ。
プロセス起動時にOSが最低1つのスレッドを作るが、そのスレッドへのハンドル。

2. 必要 (というか設計方針次第) 俺なら CloseHandle する。

3. どれでも正しい。が、開いたままのハンドル数が最小なので 例1を推奨。
引用返信 編集キー/
■63823 / inTopicNo.3)  Re[2]: 別プロセスの実行
□投稿者/ とっちゃん (3回)-(2012/10/15(Mon) 11:31:50)
とっちゃん さんの Web サイト
No63805 (774RR さん) に返信

補足しておきます。

1.
Windowsでは、プライマリスレッドあるいはメインスレッドと呼ばれます。
通常のGUIアプリの場合は、UIスレッドがメインスレッドの場合が大半ですが、UIスレッドは必ずしもメインスレッドとは限りません。
混同しないようにする必要があります。

2.
必須です。
ハンドルから参照可能な情報は、CloseHandle されるまで保持され続けます。今回の場合メインスレッドのハンドルが保持されたままの状態になるため、
実質的にそのプロセスの情報が丸ごと残ることになります。

3.
お勧めは1ですが、この場合においては、1,2,3のどれを選んでも変わりありません。
一応原則論だけ。
基本的に必要のない情報は必要がなくなった時点で参照しないことを明示するべきものとなります。
各種ハンドルは、そのハンドルごとにクローズ用の関数があります(スレッドなどのカーネルハンドルなら、CloseHandleなどなど)。
C/C++でアプリケーションを書く場合、すべてのリソースはマシンからお借りしている大事なものであるという気持ちで
プログラムを設計するとかなり安定してプログラムが動くようになります。


> まず、そのコードをボタンのハンドラ関数にて既述していないか確認。
> メッセージループ (UI スレッド) を WaitFor*** で停止させてはいけないぞ。
>
メッセージループのあるスレッド(これをUIスレッドと呼ぶ。実際にUIが出るかどうかは関係なかったりするがそこはどうでもいいところw)で
カーネルハンドルなどを同期したい場合、WaitForSingleObject などではなく、MsgWaitForMultipleObjects などを利用してメッセージループ内で
「一緒に待機する必要」があります。

こうすることで、ハンドルがシグナル状態になる(スレッドやプロセスならそれが終了した状態)ことを待機しつつ、メッセージも処理することができるようになります。

引用返信 編集キー/
■63825 / inTopicNo.4)  Re[3]: 別プロセスの実行
□投稿者/ リュウスケ (2回)-(2012/10/15(Mon) 17:24:03)
No63805 (774RR さん) に返信
No63823 (とっちゃん さん) に返信

とてもわかりやすく教えていただき
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -