-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
サクラエディタの起動テストを追加する #1385
サクラエディタの起動テストを追加する #1385
Changes from 1 commit
9da897d
646fe63
977a210
6985c78
0de5be5
22dc1db
dba3441
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -230,20 +230,6 @@ bool CProcessFactory::StartControlProcess() | |
return false; | ||
} | ||
|
||
// 起動したプロセスが完全に立ち上がるまでちょっと待つ. | ||
// | ||
// Note: この待ちにより、ここで起動したコントロールプロセスが競争に生き残れなかった場合でも、 | ||
// 唯一生き残ったコントロールプロセスが多重起動防止用ミューテックスを作成しているはず。 | ||
// | ||
int nResult; | ||
nResult = ::WaitForInputIdle( p.hProcess, 10000 ); // 最大10秒間待つ | ||
if( 0 != nResult ){ | ||
ErrorMessage( NULL, L"\'%ls\'\nコントロールプロセスの起動に失敗しました。", szEXE ); | ||
::CloseHandle( p.hThread ); | ||
::CloseHandle( p.hProcess ); | ||
return false; | ||
} | ||
|
||
::CloseHandle( p.hThread ); | ||
::CloseHandle( p.hProcess ); | ||
|
||
|
@@ -264,27 +250,14 @@ bool CProcessFactory::WaitForInitializedControlProcess() | |
// Note: コントロールプロセス側は多重起動防止用ミューテックスを ::CreateMutex() で | ||
// 作成するよりも先に初期化完了イベントを ::CreateEvent() で作成する。 | ||
// | ||
if( !IsExistControlProcess() ){ | ||
// コントロールプロセスが多重起動防止用のミューテックス作成前に異常終了した場合など | ||
return false; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 問題点の2つ目です。 |
||
|
||
const auto pszProfileName = CCommandLine::getInstance()->GetProfileName(); | ||
std::wstring strInitEvent = GSTR_EVENT_SAKURA_CP_INITIALIZED; | ||
strInitEvent += pszProfileName; | ||
HANDLE hEvent; | ||
hEvent = ::OpenEvent( EVENT_ALL_ACCESS, FALSE, strInitEvent.c_str() ); | ||
hEvent = ::CreateEventW( NULL, TRUE, FALSE, strInitEvent.c_str() ); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. これが修正のメインです。問題点の3つ目です。 このやり方を成立させるには、このコードが実行される前に、起動されたプロセスがCreateEventを完了している必要があります。イベント発動を待機するにあたり、イベント発動するスレッドがイベントを開いていることは必要条件ではないので、ノーチェックで CreateEvent してしまえばよいです。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. これは問題無さそうですね。 |
||
if( NULL == hEvent ){ | ||
// 動作中のコントロールプロセスを旧バージョンとみなし、イベントを待たずに処理を進める | ||
// | ||
// Note: Ver1.5.9.91以前のバージョンは初期化完了イベントを作らない。 | ||
// このため、コントロールプロセスが常駐していないときに複数ウィンドウをほぼ | ||
// 同時に起動すると、競争に生き残れなかったコントロールプロセスの親プロセスや、 | ||
// 僅かに出遅れてコントロールプロセスを作成しなかったプロセスでも、 | ||
// コントロールプロセスの初期化処理を追い越してしまい、異常終了したり、 | ||
// 「タブバーが表示されない」のような問題が発生していた。 | ||
// | ||
return true; | ||
beru marked this conversation as resolved.
Show resolved
Hide resolved
|
||
TopErrorMessage( NULL, L"エディタまたはシステムがビジー状態です。\nしばらく待って開きなおしてください。" ); | ||
return false; | ||
} | ||
DWORD dwRet; | ||
dwRet = ::WaitForSingleObject( hEvent, 10000 ); // 最大10秒間待つ | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題点の1つ目です。
WaitForInputIdleはプロセス同期を簡易化する目的で用意された便利関数なので機能に制限があります。
制限
より高度な同期オブジェクトを使える場合にはそちらを使うべきで、ここのコードは既に同期オブジェクト(イベントオブジェクト)を利用しています。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コントロールプロセスの初期化完了を後の処理でイベントを使って確認しているのでこのチェックは不要だという事ですね。
このチェックが有っても害は無さそうだけど、テストする都合上削りたい的な事なんじゃないかと思います。
WaitForInputIdle
ってプロセスがユーザー入力を受け付けることができるアイドル状態になっているかを確認するAPIのようですが、コントロールプロセスが GUI を持つかというとタスクトレイのウィンドウを作ってメッセージループを回すので該当すると思います。さてこのチェックが無くても本当に問題が無いのか?ですが、まぁ多分大丈夫なんじゃないでしょうか…。コントロールプロセスとエディタプロセス間でユーザー入力による待ち受けとかは無いので。