[Linux] Thread SetGadgetState posent problème
Publié : sam. 07/mars/2009 23:08
Salut tout le monde.
J'ai repris ce petit bout de code qui ressemble à celui que je suis en train de faire, mais en beaucoup plus simple.
Le but est que la ligne qui vient d'être ajoutée soit toujours visible.
Sous Windows ce code ne pose pas de problème.
Le voici :
Si on décommente la ligne : SetGadgetState(#Listview_0, progression-1)
on a le droit à des tas de messages de ce type :
[WARNING] g_main_context_prepare(): main loop already active in another thread.
et le programme plante de façon aléatoire.
J'ai essayé d'autres fonctions, mais aucune ne m'a satisfait.
J'ai utilisé Google avec le message d'erreur
http://www.developpez.net/forums/d28796 ... er-thread/
Ou gege2061 dit :
.
Je me suis risqué sur le forum anglais, malgré que Aie s'pique note véri goud ine angliche et je suis tombé sur ce post :
http://www.purebasic.fr/english/viewtop ... d+function
D'ailleurs au passage c'est le code de Erhk que j'ai pris et que j'ai réduit encore plus.
Et bon, ben j'ai pas trop compris.
Ce qui est bizarre c'est que SetGadgetState ne pose pas de problème avec un ProgressBarGadget???
Avec tous ceux qui bidouillent sous Linux je pense que vous avez déjà dû avoir à faire un SetGadgetState sur un ListViewGadget?
J'espère que vous pourrez m'aider.
Bye.
J'ai repris ce petit bout de code qui ressemble à celui que je suis en train de faire, mais en beaucoup plus simple.
Le but est que la ligne qui vient d'être ajoutée soit toujours visible.
Sous Windows ce code ne pose pas de problème.
Le voici :
Code : Tout sélectionner
EnableExplicit
Global progression.l = 0, quit.l = 0, Event.l
Enumeration
#Window_principale
#ProgressBarGadget
#Button_valider
#Listview_0
EndEnumeration
Procedure monThread(Parametre)
Repeat
progression = progression + 1
If progression <=100
AddGadgetItem (#Listview_0, progression, Str(progression))
;;;;SetGadgetState(#Listview_0, progression-1) ; ---------------------Si on vire ça plus de problème sous Linux
SetGadgetState(#ProgressBarGadget, progression)
EndIf
Delay(250)
Until quit = 1
EndProcedure
Procedure Open_Window_principale()
If OpenWindow(#Window_principale, 0, 0, 440, 260, "Transfert.", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
ProgressBarGadget(#ProgressBarGadget, 35, 20, 360, 10, 0, 100)
ButtonGadget(#Button_valider, 160, 40, 100, 24, "Valider")
ListViewGadget(#Listview_0, 5, 80, 430, 170)
EndIf
EndProcedure
Open_Window_principale()
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case #Button_valider
CreateThread(@monThread(), 0)
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
Si on décommente la ligne : SetGadgetState(#Listview_0, progression-1)
on a le droit à des tas de messages de ce type :
[WARNING] g_main_context_prepare(): main loop already active in another thread.
et le programme plante de façon aléatoire.
J'ai essayé d'autres fonctions, mais aucune ne m'a satisfait.
J'ai utilisé Google avec le message d'erreur
http://www.developpez.net/forums/d28796 ... er-thread/
Ou gege2061 dit :
Je suis allé voir la FAQ GTK : http://gtk.developpez.com/faq/?page=gtk ... CLE_threadLa boucle principale et les threads ne font pas bon ménage, tu doit exécuter gtk_main dans un premier thread et ton code ci-dessus dans un autre thread ?
Bon là c'est déjà hors de mes compétences et j'ai l'impression que c'est la solutionPourquoi mon programme se bloque lorsque j'utilise les threads ? :
Si vous êtes sûr que votre code est exempt de bug, cela peut-être dû à une mauvaise utilisation des threads. En effet ces derniers ne doivent pas être utilisés en parallèle à la boucle principale du programme (lancée par la fonction gtk_main). Il faut simplement ajouter une fonction à cette boucle.

Je me suis risqué sur le forum anglais, malgré que Aie s'pique note véri goud ine angliche et je suis tombé sur ce post :
http://www.purebasic.fr/english/viewtop ... d+function
D'ailleurs au passage c'est le code de Erhk que j'ai pris et que j'ai réduit encore plus.
Et bon, ben j'ai pas trop compris.
Ce qui est bizarre c'est que SetGadgetState ne pose pas de problème avec un ProgressBarGadget???
Avec tous ceux qui bidouillent sous Linux je pense que vous avez déjà dû avoir à faire un SetGadgetState sur un ListViewGadget?
J'espère que vous pourrez m'aider.
Bye.