マルチスレッドプログラミングで悩んでいます...
CAN to USB モジュールを介して外部デバイスと通信するアプリケーションがあります。アプリケーションは CAN バス上で正常に通信していますが、アプリケーションが毎秒「ハートビート」メッセージを送信する必要があります。
これは、スレッドを使用するのに最適な時期のように思われるので、1 秒ごとに起動してハートビートを送信するスレッドを作成しました。私が抱えている問題は、CAN バス インターフェイスの共有です。ハートビートは、バスがアイドル状態のときにのみ送信する必要があります。リソースを共有するにはどうすればよいですか?
ここに私がこれまでに持っているものを示す擬似コードがあります:
TMainThread
{
Init:
CanBusApi =new TCanBusApi;
MutexMain =CreateMutex( "CanBusApiMutexName" );
HeartbeatThread =new THeartbeatThread( CanBusApi );
Execution:
WaitForSingleObject( MutexMain );
CanBusApi->DoSomething();
ReleaseMutex( MutexMain );
}
THeartbeatThread( CanBusApi )
{
Init:
MutexHeart =CreateMutex( "CanBusApiMutexName" );
Execution:
Sleep( 1000 );
WaitForSingleObject( MutexHeart );
CanBusApi->DoHeartBeat();
ReleaseMutex( MutexHeart );
}
私が見ている問題は、DoHeartBeat が呼び出されると、予想どおり MutexMain を待っている間にメイン スレッドがブロックされることですが、DoHeartBeat も停止します。DoHeartBeat は、WaitForSingleObject(MutexMain) が失敗してタイムアウトになるまで完了しません。
DoHeartBeat は MainThread または HeartBeatThread のコンテキストで実行されますか? MainThread で実行しているようです。
私は何を間違っていますか?より良い方法はありますか?
ありがとう、デビッド