Arrêt d'une commande

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Arrêt d'une commande

Message par parisse » mer. mai 02, 2012 6:50 pm

J'observe aussi des segfault en faisant kill_thread, je pense que c'est parce qu'on ne devrait pas canceller un thread à n'importe quel moment. Il faudrait un traceback (bt sous gdb) pour avoir une petite idée d'où ça vient mais sans grand espoir. C'est pour ça que je préfère mettre ctrl_c à true et ne faire le kill_thread que si ctrl_c n'a pas marché au bout d'un certain temps.
Pour ifactor, je suis en train de coder un crible quadratique (MPQS) pour pouvoir factoriser "décemment" sans PARI (et je suis en train aussi de patcher tommath pour pouvoir éviter de perdre du temps avec des malloc dans les divisions).

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: Arrêt d'une commande

Message par loic » jeu. mai 03, 2012 6:46 am

C'est pour ça que je préfère mettre ctrl_c à true et ne faire le kill_thread que si ctrl_c n'a pas marché au bout d'un certain temps.
Quelle est la différence antre ctrl_c à true ou false?
(Dans mon code, d'ailleurs, j'initialise ctr_c à true)
je pense que c'est parce qu'on ne devrait pas canceller un thread à n'importe quel moment
Vous voulez dire que le thread est interrompu brutalement?
Il n'y a pas moyen que, lorsque kill_thread est invoqué,on activer un flag que l'on peut référencer dans les traitements pouvant être long ? (factorisation, boucle etc)

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Arrêt d'une commande

Message par parisse » jeu. mai 03, 2012 11:31 am

loic a écrit :
Quelle est la différence antre ctrl_c à true ou false?
(Dans mon code, d'ailleurs, j'initialise ctr_c à true)
...

Vous voulez dire que le thread est interrompu brutalement?
Il n'y a pas moyen que, lorsque kill_thread est invoqué,on activer un flag que l'on peut référencer dans les traitements pouvant être long ? (factorisation, boucle etc)
ctrl_c est une variable qui est testee par un certain nombre de fonctions de giac (par exemple les fonctions arithmetiques de base), et permet d'interrompre proprement le calcul (en liberant les ressources par exemple). Mais si on entre dans une boucle ou ctrl_c n'est pas testee, on peut y rester indefiniment, d'ou l'interet de pouvoir aussi arreter le thread de l'exterieur.
Le role de ctrl_c est justement d'eviter un arret brutal du thread.
ctrl_c est remis a false par protecteval au debut, et comme protecteval est appele par make_thread la valeur que vous donnez a ctrl_c au debut n'a pas d'importance.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: Arrêt d'une commande

Message par loic » jeu. mai 03, 2012 12:00 pm

En fait, si je comprends bien, le crtl_c ne peux pas être testé par exemple dans certains outils externes à giac?

Sinon, il n'est pas possible qu'avec make_thread, on est, en plus, cette sécurité pour augmenter les chances d'interrompre proprement?

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Arrêt d'une commande

Message par parisse » jeu. mai 03, 2012 12:13 pm

Si bien sur on peut tester ctrl_c en-dehors de giac mais je n'en vois pas trop l'interet. Par contre dans le thread qui controle (ou qui gere l'UI) on peut mettre ctrl_c a true, lancer une boucle de temporisation de 1 ou 2 secondes, puis si le thread de calcul ne s'est pas arrete gentiment, faire kill_thread(true,contextptr) pour le tuer brutalement.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: Arrêt d'une commande

Message par loic » jeu. mai 03, 2012 12:19 pm

Ah c'est intéressant cette option.
donc, comment peut-on procéder pour activer ctrl_c à true dans le thread créé par la commande make_thread?

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Arrêt d'une commande

Message par parisse » jeu. mai 03, 2012 12:31 pm

ctrl_c est une variable partagee par tous les threads, il suffit donc de la changer depuis le thread de l'UI.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: Arrêt d'une commande

Message par loic » jeu. mai 03, 2012 2:20 pm

Super, ça marche! (Je n'en reviens pas, les efforts valaient le coup)

En tout cas, merci pour toutes les précieuses réponses apportées.
j'ai commité le tout, vous pouvez faire des essais (git pull dans votre répertoire d'origine).

Dans un premier temps, pendant 2 s, le programme essaye avec ctrl_c=true.
Si la tâche ne s'interrompt pas, alors message d'avertissement puis tentative avec kill_thread.

Globalement, ça crashe très peu à présent. De plus, ctrl_c=true ne semble provoquer aucun crash quand il réussit.

alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

Re: Arrêt d'une commande

Message par alb » jeu. mai 03, 2012 7:08 pm

Bonsoir,
Sauf erreur dans ma mise à jour expand((a+b+c)^120) fait apparaître le bouton stop immédiatement et impossible de stopper, 1mn15 environ pour afficher le résultat

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: Arrêt d'une commande

Message par loic » jeu. mai 03, 2012 7:43 pm

Oui, c'est un problème que je n'ai pas encore attaqué.
En fait, ce qui bolque l'affichage, c'est la création du composant graphique affichant la réponse (elle est un peu longue cette réponse, hein! ;) )
D'ailleurs, chez moi, ce composant est tellement lourd à gérer que cela gène ensuite le scroll dela feuille de calcul.

Tiens, je m'aperçois que dans Xcas, il n'affiche pas la réponse.
Surement que c'est un comportement par défaut à définir pour les réponses trop longues comme celles-ci

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Arrêt d'une commande

Message par parisse » jeu. mai 03, 2012 7:48 pm

Oui, je limite a une taille maxi dans xcas pour eviter ces problemes.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: Arrêt d'une commande

Message par loic » jeu. mai 03, 2012 7:58 pm

Tiens, par curioisté, vous créez l'affichage "pretty print" directement du gen ou à partir de la chaine obtenue avec print(gen)?

Répondre