私は使用しようとしているSetEvent
のでWaitForMultipleObjects
、イベントを使用して同期したい関数をいくつか書きました。最初の関数を実行してから、2番目の関数を実行するように通知し、次に最初の関数を再度実行するように通知します。
2 つのイベントが作成され、1 つはシグナル状態に初期化され、もう 1 つは非シグナル状態に初期化されました。実行を期待どおりに実行できる唯一の方法は、各スレッドを 10 ミリ秒スリープ状態にすることです。SetEvent の使用に関するいくつかの警告について読みました: http://cboard.cprogramming.com/windows-programming/100818-setevent-resetevent-3.html
私の質問は、これらの関数呼び出しが実際にイベントを通知するために余分な時間を必要とするため、スレッドをスリープ状態にする必要があるかどうかです。デバッグ時に、設定されているイベントが未通知のままになることがあります。プロセス エクスプローラーを使用してこれを確認します。私のコードは基本的に次のようになります。
概して:
//1. FinCalcpidUpdatestruct << initialize to unsignalled
//2. FinUpdatestructCalcpid << initialize to signalled
FinCalcpidUpdatestruct = CreateEvent (NULL, FALSE, FALSE, TEXT("FinCalcpidUpdatestruct"));
FinUpdatestructCalcpid = CreateEvent (NULL, FALSE, TRUE, TEXT ("FinUpdatestructCalcpid"));
void function1()
{
int n;
int noGoCode;
n=0;
noGoCode = 0;
while(1)
{
//Sleep(10);
noGoCode = WaitForSingleObject (FinCalcpidUpdatestruct, INFINITE);
if (noGoCode == WAIT_OBJECT_0) {
//wait for FinCalcpidUpdatestruct to be signalled
BufferOut[n] = pid_data_array -> output;
//signal FinUpdatestructCalcpid
if(!SetEvent (FinUpdatestructCalcpid))
printf("Couldn't set the event FinUpdatestructCalcpid\n");
else{
printf("FinUpdatestructCalcpid event set\n");
Sleep(10);
}
}
else
printf("error\n");
}
}
void function2()
{
int nGoCode = 0;
while(1)
{
//wait for FinUpdatestructCalcpid to be signalled
// Sleep(10);
nGoCode = WaitForSingleObject (FinUpdatestructCalcpid, INFINITE);
if (nGoCode == WAIT_OBJECT_0) {
if(!SetEvent (FinCalcpidUpdatestruct))
printf("Couldn't set the event FinCalcpidUpdatestruct\n");
else{
printf("FinCalcpidUpdatestruct event set\n");
Sleep(10);
}
}
else
printf("error\n");
}//end while(1)
スリープが使用されていない場合、2 つの関数間でピンポンを行ったり来たりする代わりに、同じ関数が while ループを数回実行することがあります。何か案は?