[prog c] Comment recuperer l'etat d'avancement d'une fonction ?
5 réponses
smber
Bonjour,
Dans un programme C sous HP-UX, j'appelle une fonction d'une lib qui
tout au long de son execution va mettre à jour son etat d'avancement
dans une variable passée en parametre. Pendant le deroulement de la
fonction, je souhaiterai donc en parallèle aller verifier l'état de
l'avancement afin de l'afficher pour l'utilisateur (l'affichage est
géré à part, je ne m'en occupe pas ici).
Comment faire ? Suis-je obligé de faire du multithreading ou
existe-t-il une solution plus simple ?
Si la solution est de faire du multithreading, où trouver un exemple
simple ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pascal Bourguignon
(Sebastien BERNARD2) writes:
Bonjour,
Dans un programme C sous HP-UX, j'appelle une fonction d'une lib qui tout au long de son execution va mettre à jour son etat d'avancement dans une variable passée en parametre. Pendant le deroulement de la fonction, je souhaiterai donc en parallèle aller verifier l'état de l'avancement afin de l'afficher pour l'utilisateur (l'affichage est géré à part, je ne m'en occupe pas ici).
Comment faire ? Suis-je obligé de faire du multithreading ou existe-t-il une solution plus simple ?
Si la fonction est prévue pour appeler un "callback", alors pas la peine de faire du multithreading.
C'est typiquement quelque chose comme:
void call_back_print_progress(void* ref) { int progress=bibxyz_get_progress(); printf("rProgress: %3d %%"); }
Dans un programme C sous HP-UX, j'appelle une fonction d'une lib qui
tout au long de son execution va mettre à jour son etat d'avancement
dans une variable passée en parametre. Pendant le deroulement de la
fonction, je souhaiterai donc en parallèle aller verifier l'état de
l'avancement afin de l'afficher pour l'utilisateur (l'affichage est
géré à part, je ne m'en occupe pas ici).
Comment faire ? Suis-je obligé de faire du multithreading ou
existe-t-il une solution plus simple ?
Si la fonction est prévue pour appeler un "callback", alors pas la
peine de faire du multithreading.
C'est typiquement quelque chose comme:
void call_back_print_progress(void* ref)
{
int progress=bibxyz_get_progress();
printf("rProgress: %3d %%");
}
Dans un programme C sous HP-UX, j'appelle une fonction d'une lib qui tout au long de son execution va mettre à jour son etat d'avancement dans une variable passée en parametre. Pendant le deroulement de la fonction, je souhaiterai donc en parallèle aller verifier l'état de l'avancement afin de l'afficher pour l'utilisateur (l'affichage est géré à part, je ne m'en occupe pas ici).
Comment faire ? Suis-je obligé de faire du multithreading ou existe-t-il une solution plus simple ?
Si la fonction est prévue pour appeler un "callback", alors pas la peine de faire du multithreading.
C'est typiquement quelque chose comme:
void call_back_print_progress(void* ref) { int progress=bibxyz_get_progress(); printf("rProgress: %3d %%"); }
j'aurai personnellement, je n'aurais pas détaché le thread. Je préfère détacher uniquement lorsque cela est nécessaire. J'aurais plutôt mis un pipe ou un signal pour indiquer la fin du thread.
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
-- DINH V. Hoa,
"ça doit être une racaille pour être aussi con" -- Cent-Quarante-Six
j'aurai personnellement, je n'aurais pas détaché le thread. Je préfère
détacher uniquement lorsque cela est nécessaire.
J'aurais plutôt mis un pipe ou un signal pour indiquer la fin du thread.
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal
avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
--
DINH V. Hoa,
"ça doit être une racaille pour être aussi con" -- Cent-Quarante-Six
j'aurai personnellement, je n'aurais pas détaché le thread. Je préfère détacher uniquement lorsque cela est nécessaire. J'aurais plutôt mis un pipe ou un signal pour indiquer la fin du thread.
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
-- DINH V. Hoa,
"ça doit être une racaille pour être aussi con" -- Cent-Quarante-Six
j'aurai personnellement, je n'aurais pas détaché le thread. Je préfère détacher uniquement lorsque cela est nécessaire. J'aurais plutôt mis un pipe ou un signal pour indiquer la fin du thread.
Ça dépend de ce qu'on a à faire. Dans le cas de l'exemple, comme le thread principal passe son temps à dormir ou à afficher le progrès, il n'y a pas de raison de s'embêter avec des signaux: c'est synchrone!
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
À quoi ça sert d'envoyer un signal si on y met un délai limité ? On risque de ne pas le voir passer et alors c'est comme si on n'avait rien fait, non?
j'aurai personnellement, je n'aurais pas détaché le thread. Je préfère
détacher uniquement lorsque cela est nécessaire.
J'aurais plutôt mis un pipe ou un signal pour indiquer la fin du thread.
Ça dépend de ce qu'on a à faire. Dans le cas de l'exemple, comme le
thread principal passe son temps à dormir ou à afficher le progrès, il
n'y a pas de raison de s'embêter avec des signaux: c'est synchrone!
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal
avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
À quoi ça sert d'envoyer un signal si on y met un délai limité ? On
risque de ne pas le voir passer et alors c'est comme si on n'avait
rien fait, non?
j'aurai personnellement, je n'aurais pas détaché le thread. Je préfère détacher uniquement lorsque cela est nécessaire. J'aurais plutôt mis un pipe ou un signal pour indiquer la fin du thread.
Ça dépend de ce qu'on a à faire. Dans le cas de l'exemple, comme le thread principal passe son temps à dormir ou à afficher le progrès, il n'y a pas de raison de s'embêter avec des signaux: c'est synchrone!
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
À quoi ça sert d'envoyer un signal si on y met un délai limité ? On risque de ne pas le voir passer et alors c'est comme si on n'avait rien fait, non?
Ça dépend de ce qu'on a à faire. Dans le cas de l'exemple, comme le thread principal passe son temps à dormir ou à afficher le progrès, il n'y a pas de raison de s'embêter avec des signaux: c'est synchrone!
en fait, c'est plus l'histoire du "DETACHED" qui m'ennuie. J'ai l'impression qu'on ne contrôle plus trop ce qu'il se passe à côté.
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
À quoi ça sert d'envoyer un signal si on y met un délai limité ? On risque de ne pas le voir passer et alors c'est comme si on n'avait rien fait, non?
les variables condition en fait, sont toujours accompagnées par 2 autres éléments : une variable d'état comme tu as mis, et un verrou (dont on ne parlera pas ici). Et il me semble qu'il faut réémettre le signal tant qu'il n'est pas acquitté.
Enfin là, comme il nous faut l'affichage progressif, et donc, on a bien de mettre à jour de temps en temps l'affichage. Enfin, comme dis le man de rsync :
<< --progress This option tells rsync to print information showing the progress of the transfer. This gives a bored user something to watch.
(°v°)
-- DINH V. Hoa,
"ça doit être une racaille pour être aussi con" -- Cent-Quarante-Six
Ça dépend de ce qu'on a à faire. Dans le cas de l'exemple, comme le
thread principal passe son temps à dormir ou à afficher le progrès, il
n'y a pas de raison de s'embêter avec des signaux: c'est synchrone!
en fait, c'est plus l'histoire du "DETACHED" qui m'ennuie.
J'ai l'impression qu'on ne contrôle plus trop ce qu'il se passe à côté.
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal
avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
À quoi ça sert d'envoyer un signal si on y met un délai limité ? On
risque de ne pas le voir passer et alors c'est comme si on n'avait
rien fait, non?
les variables condition en fait, sont toujours accompagnées par 2 autres
éléments : une variable d'état comme tu as mis, et un verrou (dont on ne
parlera pas ici).
Et il me semble qu'il faut réémettre le signal tant qu'il n'est pas
acquitté.
Enfin là, comme il nous faut l'affichage progressif, et donc, on a
bien de mettre à jour de temps en temps l'affichage. Enfin, comme dis le
man de rsync :
<<
--progress
This option tells rsync to print information showing the
progress of the transfer. This gives a bored user something to
watch.
(°v°)
--
DINH V. Hoa,
"ça doit être une racaille pour être aussi con" -- Cent-Quarante-Six
Ça dépend de ce qu'on a à faire. Dans le cas de l'exemple, comme le thread principal passe son temps à dormir ou à afficher le progrès, il n'y a pas de raison de s'embêter avec des signaux: c'est synchrone!
en fait, c'est plus l'histoire du "DETACHED" qui m'ennuie. J'ai l'impression qu'on ne contrôle plus trop ce qu'il se passe à côté.
le thread signale au père qu'il a fini, avec :
- pthread_cond_timedwait() (s'il est disponible) pour attendre le signal avec un délai maximum,
- ou sinon, un pipe avec un select() avec délai limité.
pour finir avec un pthread_join().
À quoi ça sert d'envoyer un signal si on y met un délai limité ? On risque de ne pas le voir passer et alors c'est comme si on n'avait rien fait, non?
les variables condition en fait, sont toujours accompagnées par 2 autres éléments : une variable d'état comme tu as mis, et un verrou (dont on ne parlera pas ici). Et il me semble qu'il faut réémettre le signal tant qu'il n'est pas acquitté.
Enfin là, comme il nous faut l'affichage progressif, et donc, on a bien de mettre à jour de temps en temps l'affichage. Enfin, comme dis le man de rsync :
<< --progress This option tells rsync to print information showing the progress of the transfer. This gives a bored user something to watch.
(°v°)
-- DINH V. Hoa,
"ça doit être une racaille pour être aussi con" -- Cent-Quarante-Six