J'utilise un SDK qui me permet de piloter une caméra scientifique.
J'arrive à m'en servir, mais j'ai un souci : de temps en temps (on
trouve pas pourquoi vu que ça semble aléatoire, connectique en cause
? bug du SDK (très probable vu la qualité générale du soft) ?)
certaines fonctions (vu que ça plante on sait pas lesquelles...)
freezent et du coup mon appli est figée elle aussi.
Je voudrais donc créer une petite couche intermédiaire qui wrapp
cette API (du C basique) et est capable d'en détecter un plantage
(timeout sur les appels). => je veux un watchdog en fait.
Comment faire ça de manière efficace ?
J'avais pensé à wrapper chaque appel par une fonction qui balance ça
dans un nouveau thread + WaitForSignleObject avec timeout & kill du
thread si ça plante. Mais c'est pas mal de boulot (une trentaine de
fonctions à wrapper :-/) et créer à chaque appel un thread c'est peut
être pas top nivo perf Sinon placer mon code tout entier de pilotage
dans un thread, mais c'est pas évident du tout (interraction avec
l'utilisateur...)
et ça oblige à se prendre la tête côté client.
J'aimerais une solution transparente (juste déclenchement d'une
exception en cas de freeze).
J'utilise un SDK qui me permet de piloter une caméra scientifique.
J'arrive à m'en servir, mais j'ai un souci : de temps en temps (on
trouve pas pourquoi vu que ça semble aléatoire, connectique en cause
? bug du SDK (très probable vu la qualité générale du soft) ?)
certaines fonctions (vu que ça plante on sait pas lesquelles...)
freezent et du coup mon appli est figée elle aussi.
Je voudrais donc créer une petite couche intermédiaire qui wrapp
cette API (du C basique) et est capable d'en détecter un plantage
(timeout sur les appels). => je veux un watchdog en fait.
Comment faire ça de manière efficace ?
J'avais pensé à wrapper chaque appel par une fonction qui balance ça
dans un nouveau thread + WaitForSignleObject avec timeout & kill du
thread si ça plante. Mais c'est pas mal de boulot (une trentaine de
fonctions à wrapper :-/) et créer à chaque appel un thread c'est peut
être pas top nivo perf Sinon placer mon code tout entier de pilotage
dans un thread, mais c'est pas évident du tout (interraction avec
l'utilisateur...)
et ça oblige à se prendre la tête côté client.
J'aimerais une solution transparente (juste déclenchement d'une
exception en cas de freeze).
J'utilise un SDK qui me permet de piloter une caméra scientifique.
J'arrive à m'en servir, mais j'ai un souci : de temps en temps (on
trouve pas pourquoi vu que ça semble aléatoire, connectique en cause
? bug du SDK (très probable vu la qualité générale du soft) ?)
certaines fonctions (vu que ça plante on sait pas lesquelles...)
freezent et du coup mon appli est figée elle aussi.
Je voudrais donc créer une petite couche intermédiaire qui wrapp
cette API (du C basique) et est capable d'en détecter un plantage
(timeout sur les appels). => je veux un watchdog en fait.
Comment faire ça de manière efficace ?
J'avais pensé à wrapper chaque appel par une fonction qui balance ça
dans un nouveau thread + WaitForSignleObject avec timeout & kill du
thread si ça plante. Mais c'est pas mal de boulot (une trentaine de
fonctions à wrapper :-/) et créer à chaque appel un thread c'est peut
être pas top nivo perf Sinon placer mon code tout entier de pilotage
dans un thread, mais c'est pas évident du tout (interraction avec
l'utilisateur...)
et ça oblige à se prendre la tête côté client.
J'aimerais une solution transparente (juste déclenchement d'une
exception en cas de freeze).
A part 1 thread qui fait ca pour toi, que tu peux tuer si ca te
prend trop de temps, je vois pas vraiment... Si t'as pas d'info
en provenance du materiel...
A part 1 thread qui fait ca pour toi, que tu peux tuer si ca te
prend trop de temps, je vois pas vraiment... Si t'as pas d'info
en provenance du materiel...
A part 1 thread qui fait ca pour toi, que tu peux tuer si ca te
prend trop de temps, je vois pas vraiment... Si t'as pas d'info
en provenance du materiel...
> Sinon placer mon code tout entier de pilotage
> dans un thread, mais c'est pas évident du tout (interraction avec
> l'utilisateur...)
Euh, ca va quand meme pas chercher tripette...
> et ça oblige à se prendre la tête côté client.
Moyennement quand meme !
A part 1 thread qui fait ca pour toi, que tu peux tuer si ca te prend
trop de temps, je vois pas vraiment... Si t'as pas d'info en
du materiel...
Meme avec des timer (brrrrrrrrrr), tu peux faire ca qu'avec un
> Sinon placer mon code tout entier de pilotage
> dans un thread, mais c'est pas évident du tout (interraction avec
> l'utilisateur...)
Euh, ca va quand meme pas chercher tripette...
> et ça oblige à se prendre la tête côté client.
Moyennement quand meme !
A part 1 thread qui fait ca pour toi, que tu peux tuer si ca te prend
trop de temps, je vois pas vraiment... Si t'as pas d'info en
du materiel...
Meme avec des timer (brrrrrrrrrr), tu peux faire ca qu'avec un
> Sinon placer mon code tout entier de pilotage
> dans un thread, mais c'est pas évident du tout (interraction avec
> l'utilisateur...)
Euh, ca va quand meme pas chercher tripette...
> et ça oblige à se prendre la tête côté client.
Moyennement quand meme !
A part 1 thread qui fait ca pour toi, que tu peux tuer si ca te prend
trop de temps, je vois pas vraiment... Si t'as pas d'info en
du materiel...
Meme avec des timer (brrrrrrrrrr), tu peux faire ca qu'avec un
Je t'assure c'est pas évident. Il y a d'abord l'initialisation de la
caméra, puis le mec peut autant de fois qu'il le veut capturer une
image, et enfin le shutdown. Il y a ainsi plusieurs tronçons de code
qui appellent le SDK.
Faut a chaque fois une nouvelle fonction thread à laquelle on va
passer l'objet caméra, et si y'a une progressbar à faire avancer par
exemple ça se corse encore... Car plus ça va aller et plus la camera
va être utilisée à divers endroits et pfff, bonjour le couplage du
code.
Ben si mais c'est justement par exemple l'appel à la fonction qui
donne des infos sur le matos qui plante quelques rares fois... :-/
Donc je pense bien à utiliser un thread, ce qui me dérange c'est de
créer un thread à chaque appel de fonction... Imagine la création
d'un thread à chaque appel Win32...
Meme avec des timer (brrrrrrrrrr), tu peux faire ca qu'avec un
thread...
Là je vois pas. Comment un timer peut m'aider ?
Exemple simple :
vois freeze()
{
while ( true );
}
Je veux appeler freeze() et être capable de "rompre" l'appel au bout
d'un certains temps. Avec un seul thread je vois pas.
Alors j'ai pondu ça : une classe SafeCaller qui maintient un seul
thread qui est utilisé pour faire tous les appels. Au lieu de faire
ce que je pensais au début :
bool CallFreeze()
{
CreateThread( freeze );
WaitForSingleObject( timeout );
if ( echec du wait )
{
TerminateThread();
return false; // echec de l'appel
}
return true;
}
j'ai un thread qui tourne tout le temps :
void (*fct)(); // pointeur de fonction à appeler depuis le thread
HANDLE hDoCall; // event qui déclenche le call
HANDLE hCallDone; // event qui signale que le call a été fait
ThreadProc()
{
while ( true)
{
WaitForSingleObject( hDoCall ); // attendre demande de call
(fct)(); // appeler
SetEvent( hCallDone ); // appel terminé
}
}
et ma fonction CallFreeze devient :
bool CallFreeze()
{
fct = freeze; // fonction à appeler depusi le thread
SetEvent( hDoCall ); // faire l'appel
WaitForSingleObject( hCallDone, timeout ); // attendre avec timeout
if ( echec du wait )
{
TerminateThread();
CreateThread( ThreadProc ); // relancer le thread
return false; // echec de l'appel
}
return true;
}
En combinant ça avec des fonctions template C++ je pense arriver
facilement à wrapper toutes mes fonctions.
Je t'assure c'est pas évident. Il y a d'abord l'initialisation de la
caméra, puis le mec peut autant de fois qu'il le veut capturer une
image, et enfin le shutdown. Il y a ainsi plusieurs tronçons de code
qui appellent le SDK.
Faut a chaque fois une nouvelle fonction thread à laquelle on va
passer l'objet caméra, et si y'a une progressbar à faire avancer par
exemple ça se corse encore... Car plus ça va aller et plus la camera
va être utilisée à divers endroits et pfff, bonjour le couplage du
code.
Ben si mais c'est justement par exemple l'appel à la fonction qui
donne des infos sur le matos qui plante quelques rares fois... :-/
Donc je pense bien à utiliser un thread, ce qui me dérange c'est de
créer un thread à chaque appel de fonction... Imagine la création
d'un thread à chaque appel Win32...
Meme avec des timer (brrrrrrrrrr), tu peux faire ca qu'avec un
thread...
Là je vois pas. Comment un timer peut m'aider ?
Exemple simple :
vois freeze()
{
while ( true );
}
Je veux appeler freeze() et être capable de "rompre" l'appel au bout
d'un certains temps. Avec un seul thread je vois pas.
Alors j'ai pondu ça : une classe SafeCaller qui maintient un seul
thread qui est utilisé pour faire tous les appels. Au lieu de faire
ce que je pensais au début :
bool CallFreeze()
{
CreateThread( freeze );
WaitForSingleObject( timeout );
if ( echec du wait )
{
TerminateThread();
return false; // echec de l'appel
}
return true;
}
j'ai un thread qui tourne tout le temps :
void (*fct)(); // pointeur de fonction à appeler depuis le thread
HANDLE hDoCall; // event qui déclenche le call
HANDLE hCallDone; // event qui signale que le call a été fait
ThreadProc()
{
while ( true)
{
WaitForSingleObject( hDoCall ); // attendre demande de call
(fct)(); // appeler
SetEvent( hCallDone ); // appel terminé
}
}
et ma fonction CallFreeze devient :
bool CallFreeze()
{
fct = freeze; // fonction à appeler depusi le thread
SetEvent( hDoCall ); // faire l'appel
WaitForSingleObject( hCallDone, timeout ); // attendre avec timeout
if ( echec du wait )
{
TerminateThread();
CreateThread( ThreadProc ); // relancer le thread
return false; // echec de l'appel
}
return true;
}
En combinant ça avec des fonctions template C++ je pense arriver
facilement à wrapper toutes mes fonctions.
Je t'assure c'est pas évident. Il y a d'abord l'initialisation de la
caméra, puis le mec peut autant de fois qu'il le veut capturer une
image, et enfin le shutdown. Il y a ainsi plusieurs tronçons de code
qui appellent le SDK.
Faut a chaque fois une nouvelle fonction thread à laquelle on va
passer l'objet caméra, et si y'a une progressbar à faire avancer par
exemple ça se corse encore... Car plus ça va aller et plus la camera
va être utilisée à divers endroits et pfff, bonjour le couplage du
code.
Ben si mais c'est justement par exemple l'appel à la fonction qui
donne des infos sur le matos qui plante quelques rares fois... :-/
Donc je pense bien à utiliser un thread, ce qui me dérange c'est de
créer un thread à chaque appel de fonction... Imagine la création
d'un thread à chaque appel Win32...
Meme avec des timer (brrrrrrrrrr), tu peux faire ca qu'avec un
thread...
Là je vois pas. Comment un timer peut m'aider ?
Exemple simple :
vois freeze()
{
while ( true );
}
Je veux appeler freeze() et être capable de "rompre" l'appel au bout
d'un certains temps. Avec un seul thread je vois pas.
Alors j'ai pondu ça : une classe SafeCaller qui maintient un seul
thread qui est utilisé pour faire tous les appels. Au lieu de faire
ce que je pensais au début :
bool CallFreeze()
{
CreateThread( freeze );
WaitForSingleObject( timeout );
if ( echec du wait )
{
TerminateThread();
return false; // echec de l'appel
}
return true;
}
j'ai un thread qui tourne tout le temps :
void (*fct)(); // pointeur de fonction à appeler depuis le thread
HANDLE hDoCall; // event qui déclenche le call
HANDLE hCallDone; // event qui signale que le call a été fait
ThreadProc()
{
while ( true)
{
WaitForSingleObject( hDoCall ); // attendre demande de call
(fct)(); // appeler
SetEvent( hCallDone ); // appel terminé
}
}
et ma fonction CallFreeze devient :
bool CallFreeze()
{
fct = freeze; // fonction à appeler depusi le thread
SetEvent( hDoCall ); // faire l'appel
WaitForSingleObject( hCallDone, timeout ); // attendre avec timeout
if ( echec du wait )
{
TerminateThread();
CreateThread( ThreadProc ); // relancer le thread
return false; // echec de l'appel
}
return true;
}
En combinant ça avec des fonctions template C++ je pense arriver
facilement à wrapper toutes mes fonctions.
> Y'aurait plus simple mais tu vois que ca marche et que tu peux le
en
plus ;-D. Perso, je vois pas d'autres alternatives.
> Y'aurait plus simple mais tu vois que ca marche et que tu peux le
en
plus ;-D. Perso, je vois pas d'autres alternatives.
> Y'aurait plus simple mais tu vois que ca marche et que tu peux le
en
plus ;-D. Perso, je vois pas d'autres alternatives.
> Salut,
Je pense comme Doms.
Par exemple tu ajoutes l'incrément d'un compteur dans les boucles des
modules qui plantes. Tout ceci est dans un thread particulier.
Un autre thread regarde si ce compteur évolue sinon il tue l'autre tache.
> Salut,
Je pense comme Doms.
Par exemple tu ajoutes l'incrément d'un compteur dans les boucles des
modules qui plantes. Tout ceci est dans un thread particulier.
Un autre thread regarde si ce compteur évolue sinon il tue l'autre tache.
> Salut,
Je pense comme Doms.
Par exemple tu ajoutes l'incrément d'un compteur dans les boucles des
modules qui plantes. Tout ceci est dans un thread particulier.
Un autre thread regarde si ce compteur évolue sinon il tue l'autre tache.
C'est l'histoire du timer qui m'a perturbé.
Pour le + simple, tu peux développer un peu ?
C'est l'histoire du timer qui m'a perturbé.
Pour le + simple, tu peux développer un peu ?
C'est l'histoire du timer qui m'a perturbé.
Pour le + simple, tu peux développer un peu ?