Я борюсь с многопоточным программированием ...
У меня есть приложение, которое общается с внешним устройством через CAN на USB
модуль. У меня приложение нормально говорит по шине CAN, но
существует требование, чтобы приложение передавало «сердцебиение»
сообщение каждую секунду.
Звучит как идеальное время для использования тем, поэтому я создал тему
который просыпается каждую секунду и посылает сердцебиение. Проблема я
Имеет общий доступ к интерфейсу шины 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.
Что я делаю не так? Есть ли лучший способ?
Спасибо,
David