Je me bats avec la programmation multi-thread ...partage des ressources Discussion
J'ai une application qui parle à un dispositif externe via un CAN au module USB . J'ai l'application parler au bus CAN très bien, mais il est nécessaire pour l'application de transmettre un « battement de coeur » message à chaque seconde.
Cela semble être le moment idéal pour utiliser des threads, donc j'ai créé un thread qui se réveille toutes les secondes et envoie le battement de coeur. Le problème que je suis ayant partage l'interface de bus CAN. Le signal de présence doit uniquement être envoyé lorsque le bus est inactif. Comment partager la ressource?
Voici le code pseudo montrant ce que j'ai jusqu'à présent:
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);
}
Le problème que je vois est que quand DoHeartBeat est appelée, elle provoque le thread principal bloquer en attendant MutexMain comme prévu, mais DoHeartBeat s'arrête également. DoHeartBeat ne se termine qu'après l'expiration du délai de WaitForSingleObject (MutexMain).
Est-ce que DoHeartBeat s'exécute dans le contexte MainThread ou HeartBeatThread? Il semble être en cours d'exécution dans MainThread.
Qu'est-ce que je fais mal? Y a-t-il un meilleur moyen?
Merci, David
David, vous avez raison. C'était de ma faute. –