Bonjour a tous,
J'ai ecrit une petite appli en C et en utilisant pthread pour le multithreading.
Dans un thread, j'ai une session OpenGL qui tourne (avec GLUT) pour afficher mes objects et dans un autre thread, j'ai une session python
"embedded" dans mon code C qui tourne avec la tres pratique fonction PyRun_InteractiveLoop(). Celle-ci delivre tous simplement le shell de python ce qui est tres pratique pour scripter ma scene OpenGL.
Mon probleme est de quitter mon programme correctement! Je voudrais donner a l'utilisateur la possibilite de quitter le programme a partir de la fenetre OpenGL (en simplement fermant la fenetre par example) ET a partir du shell python.
A partir de Python, si l'utilisateur tape "exit()" ou presse "Ctr-D", la fonction PyRun_InteractiveLoop() exit et je peux alors appeler Py_Finalize() et quitter le thread pour revenir au main et quitter avec le flag "quit_main_switch" :
avec dans le main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("import os"); PyRun_SimpleString("import readline"); PyRun_InteractiveLoop(stdin,"<stdin>"); Py_Finalize(); quit_main_switch = 1; pthread_exit(NULL);
Par contre, a partir d'OpenGL, je rencontre un petit probleme: lorsque je termine la session OpenGL, il me bien evidement aussi terminer la session python qui tourne encore dans l'autre thread. Comment faire ca ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while(1){ //representant la boucle OpenGL if(quit_main_switch){ exit(0); } }
J'ai bien essayer de faire un simple thread_cancel() et thread_exit(), mais cela equivaut a un exit(0) sur le thread et empeche une termination normale de la session python (avec Py_Finalize(), etc...). Cela provoque un probleme avec le bash shell duquel l'appli fut lancee et je dois faire un "stty sane" ou "reset" pour tous remettre en etat.
Y-a-t-il une fonction qui permet de terminer PyRun_InteractiveLoop() ?
j'espere que c'est claire...
merci d'avance
David
Partager