イベントでCreateEventを使用すると、イベントでCreateEvent Notesを使用してマルチプロセスの同期方法ノート

https://www.cnblogs.com/aakuang/p/3514658.html

イベントでCreateEvent Notesを使用して

 
HANDLEの でCreateEvent(
LPSECURITY_ATTRIBUTESの lpEventAttributes、//セキュリティ属性
BOOL bManualReset、//リセット
BOOL bInitialState、//初期状態
LPCTSTR lpName //オブジェクト名
); [1]

パラメータ

lpEventAttributes [入力]

点は SECURITY_ATTRIBUTES 返されたハンドルは、子プロセスに継承することができるかどうかを決定するために、構造体へのポインタ。lpEventAttributesがNULLの場合、ハンドルは継承することはできません。
Windows NT / 2000:メンバーでlpEventAttributes構造は、新しいイベントのためのセキュリティ記号を指定します。lpEventAttributesがNULLの場合、イベントはデフォルトのセキュリティ記号を取得します。
bManualReset [入力]
指定し たイベントオブジェクトは、 手動または自動復旧回復に作成されます。それがTRUEの場合、この関数は手動で無信号状態を回復しないために、イベントのステータスでResetEventする必要があります。FALSEに設定すると、待機中のスレッドが解放された後と、システムが自動的にイベントの状態に戻ります無信号ではありません。
bInitialState [入力]
指定されたイベントオブジェクトの初期状態。TRUEの場合、初期状態が通知され、そうでない場合は無信号状態。
lpName [入力]
オブジェクト指定されたイベントの名前は、ゼロで終わる文字列である ポインタ 名前 の文字形式は MAX_PATHで定義されています。名前は大文字と小文字が区別されます。
lpNameは名前を指定し、イベントオブジェクトの名前が既存の名前と同じ場合、この関数はオブジェクトが存在してアクセスするためにEVENT_ALL_ACCESSを要求します。bManualResetとbInitialStateパラメータによるイベントを作成するプロセスに設定されている。この時点では、これら2つのパラメータは無視されます。lpEventAttributesパラメータがNULLでない場合、それはハンドルを継承できるかどうかを判断しますが、その セキュリティ記述子の メンバーは無視されます。
lpNameがNULLの場合、我々は無名のイベントオブジェクトを作成します。
 
 
注意:
1は、同期の場合は、あなたがの間でのイベントのコースの具体的な名前を作成する必要があり、それは、パラメータlpNameはnil、イベントオブジェクトの名前と同じではありません。
図2に示すように、裏面に復元手動回復の場合、SetEvent最初の開始信号は、ResetEvent無信号状態、一つ一つを使用しなければなりません。
SetEvent場合は、イベントオブジェクトのすべての信号があります。イベントのオブジェクトがシグナル状態に設定されると、その後、待って待っていると、任意の数のスレッドがリリースされるスレッドを開始しました。
ました
  FEvent:枢機卿。
 
FEvent:=でCreateEvent(NIL、TRUE、FALSE、 'syn_recansend'); //場合無信号イベントを作成します
SetEvent(FEvent); //信号を開始します
若しくは
FEvent:=のCreateEvent(nilに、TRUE、真の 'syn_recansend'); //とき無信号イベントを作成します
 
//手動復旧
手順TForm1.btn5Click(送信者:TObjectを)
開始
  信号がWAIT_OBJECT_0が正常に戻ったIFのWaitForSingleObject(INFINITEのFEvent)// =次いでWAIT_OBJECT_0等しい
  始まります
    ReSetEvent(FEvent);他のスレッドが待機するように信号は、無信号に設定されるまで//待つ
    ;のOutputDebugStringを(「ライト・ファイル他のものを、同期コードを必要」)
    SetEvent(FEvent); //は、上記の問題に後の設定行っています信号の状態、他のスレッドは、物事を行うための信号を待っているように、
  終わりを。
終わり;
  
3、自動回復信号の場合、SetEventは、現在待機中のスレッドを解放します。
イベントオブジェクトの状態を自動的に復元するように設定されている場合、オブジェクトステータス信号の状態は、待機スレッドが解放されるまでそこに留まる、シグナリング、これは自動的に符号なしの状態として機能するように設定されます。何の待機中のスレッドが待機していないがある場合は、イベントオブジェクトの状態が通知されたまま。
ました
  FEvent:枢機卿。
 
FEvent:=のCreateEvent(ゼロ、虚偽、FALSE、 'syn_recansend'); //とき無信号イベントを作成します
SetEvent(FEvent); //信号を開始します
若しくは
FEvent:=のCreateEvent(ゼロ、FALSE、TRUE、 'syn_recansend'); //とき無信号イベントを作成します
 
//自動回復
手順TForm1.btn5Click(送信者:TObjectを);
ベギン  
  WaitForSingleObject(FEvent、INFINITE)= WAIT_OBJECT_0は、次に//等しいWAIT_OBJECT_0成功した戻り信号は、信号が自動解除を解放する場合は場合 
  ベギン
    OutputDebugString(「ファイルのようなものを書き、同期コードが必要です」);
    SetEvent(FEvent); //他のスレッドへの信号は、信号とは何かを待っている状態に設定上記の仕上げのもの。
  終わり;
//ここでSetEventないでください(FEvent);、我々は、上記SetEventた理由上記自動的ResetEventのWaitForSingleObjectが、成功のために待ってます。
終わり;
 
4、最終リリースイベント
もしFEvent <> 0その後、
  CloseHandleを(FEvent)。
HANDLEの でCreateEvent(
LPSECURITY_ATTRIBUTESの lpEventAttributes、//セキュリティ属性
BOOL bManualReset、//リセット
BOOL bInitialState、//初期状態
LPCTSTR lpName //オブジェクト名
); [1]

パラメータ

lpEventAttributes [入力]

点は SECURITY_ATTRIBUTES 返されたハンドルは、子プロセスに継承することができるかどうかを決定するために、構造体へのポインタ。lpEventAttributesがNULLの場合、ハンドルは継承することはできません。
Windows NT / 2000:メンバーでlpEventAttributes構造は、新しいイベントのためのセキュリティ記号を指定します。lpEventAttributesがNULLの場合、イベントはデフォルトのセキュリティ記号を取得します。
bManualReset [入力]
指定し たイベントオブジェクトは、 手動または自動復旧回復に作成されます。それがTRUEの場合、この関数は手動で無信号状態を回復しないために、イベントのステータスでResetEventする必要があります。FALSEに設定すると、待機中のスレッドが解放された後と、システムが自動的にイベントの状態に戻ります無信号ではありません。
bInitialState [入力]
指定されたイベントオブジェクトの初期状態。TRUEの場合、初期状態が通知され、そうでない場合は無信号状態。
lpName [入力]
オブジェクト指定されたイベントの名前は、ゼロで終わる文字列である ポインタ 名前 の文字形式は MAX_PATHで定義されています。名前は大文字と小文字が区別されます。
lpNameは名前を指定し、イベントオブジェクトの名前が既存の名前と同じ場合、この関数はオブジェクトが存在してアクセスするためにEVENT_ALL_ACCESSを要求します。bManualResetとbInitialStateパラメータによるイベントを作成するプロセスに設定されている。この時点では、これら2つのパラメータは無視されます。lpEventAttributesパラメータがNULLでない場合、それはハンドルを継承できるかどうかを判断しますが、その セキュリティ記述子の メンバーは無視されます。
lpNameがNULLの場合、我々は無名のイベントオブジェクトを作成します。
 
 
注意:
1は、同期の場合は、あなたがの間でのイベントのコースの具体的な名前を作成する必要があり、それは、パラメータlpNameはnil、イベントオブジェクトの名前と同じではありません。
図2に示すように、裏面に復元手動回復の場合、SetEvent最初の開始信号は、ResetEvent無信号状態、一つ一つを使用しなければなりません。
SetEvent場合は、イベントオブジェクトのすべての信号があります。イベントのオブジェクトがシグナル状態に設定されると、その後、待って待っていると、任意の数のスレッドがリリースされるスレッドを開始しました。
ました
  FEvent:枢機卿。
 
FEvent:=でCreateEvent(NIL、TRUE、FALSE、 'syn_recansend'); //場合無信号イベントを作成します
SetEvent(FEvent); //信号を開始します
若しくは
FEvent:=のCreateEvent(nilに、TRUE、真の 'syn_recansend'); //とき無信号イベントを作成します
 
//手動復旧
手順TForm1.btn5Click(送信者:TObjectを)
開始
  信号がWAIT_OBJECT_0が正常に戻ったIFのWaitForSingleObject(INFINITEのFEvent)// =次いでWAIT_OBJECT_0等しい
  始まります
    ReSetEvent(FEvent);他のスレッドが待機するように信号は、無信号に設定されるまで//待つ
    ;のOutputDebugStringを(「ライト・ファイル他のものを、同期コードを必要」)
    SetEvent(FEvent); //は、上記の問題に後の設定行っています信号の状態、他のスレッドは、物事を行うための信号を待っているように、
  終わりを。
終わり;
  
3、自動回復信号の場合、SetEventは、現在待機中のスレッドを解放します。
イベントオブジェクトの状態を自動的に復元するように設定されている場合、オブジェクトステータス信号の状態は、待機スレッドが解放されるまでそこに留まる、シグナリング、これは自動的に符号なしの状態として機能するように設定されます。何の待機中のスレッドが待機していないがある場合は、イベントオブジェクトの状態が通知されたまま。
ました
  FEvent:枢機卿。
 
FEvent:=のCreateEvent(ゼロ、虚偽、FALSE、 'syn_recansend'); //とき無信号イベントを作成します
SetEvent(FEvent); //信号を開始します
若しくは
FEvent:=のCreateEvent(ゼロ、FALSE、TRUE、 'syn_recansend'); //とき無信号イベントを作成します
 
//自動回復
手順TForm1.btn5Click(送信者:TObjectを);
ベギン  
  WaitForSingleObject(FEvent、INFINITE)= WAIT_OBJECT_0は、次に//等しいWAIT_OBJECT_0成功した戻り信号は、信号が自動解除を解放する場合は場合 
  ベギン
    OutputDebugString(「ファイルのようなものを書き、同期コードが必要です」);
    SetEvent(FEvent); //他のスレッドへの信号は、信号とは何かを待っている状態に設定上記の仕上げのもの。
  終わり;
//ここでSetEventないでください(FEvent);、我々は、上記SetEventた理由上記自動的ResetEventのWaitForSingleObjectが、成功のために待ってます。
終わり;
 
4、最終リリースイベント
もしFEvent <> 0その後、
  CloseHandleを(FEvent)。

おすすめ

転載: www.cnblogs.com/delphi-xe5/p/10947380.html