Page 1 sur 1
thread appelle une procedure
Publié : mer. 19/oct./2016 15:29
par ChaudEf
Bonjour, j'ai fait un thread qui appelle une procedure, et ca plante, en disant:
Code : Tout sélectionner
[17:11:16] [ERROR] OpenWindow() can only be called from the main thread.
il y a une solution?
merci
Re: thread appelle une procedure
Publié : mer. 19/oct./2016 15:58
par Ar-S
C'est ta procédure qui doit être threadée.
Sans code je ne peux pas t'en dire plus.
exemple de procédure en thread
Code : Tout sélectionner
Global X, TOTO = 0
Procedure procethread(*valeurfictive)
Repeat
Delay(1000)
X+1
SetGadgetText(1, Str(x) + "/10")
Until x = 10
If x = 10
TOTO = 1
Else
TOTO = 0
EndIf
Debug "valeur de toto : " + TOTO
; on sort du thread
EndProcedure
OpenWindow(0,0,0,200,50,"teste",#PB_Window_SystemMenu)
StringGadget(1,0,0,150,20,"")
MonThread = CreateThread(@procethread(),*valeurfictive)
Repeat
event=WaitWindowEvent(1)
If toto = 1
If IsThread(MonThread)
SetGadgetText(1," Thread actif")
Else
SetGadgetText(1," Il ni a plus de thread")
EndIf
EndIf
Until event=#PB_Event_CloseWindow
;Dans le cas ou l'on quitte le prog inopinément
If IsThread(MonThread)
Debug "Thread en cours... Je le tue"
KillThread(MonThread)
; Je reteste ^^ pour l'exemple
If IsThread(MonThread)
Debug "Thread en cours... Je le re-tue, ce qui n'est pas normal"
KillThread(MonThread)
Else
Debug "Il est mort, je quitte..."
EndIf
EndIf
On voit qu'à la fin de son exécution, le thread se tue tout seul.
En revanche j'ai ajouté la vérification de l'existence du thread lors de l'arrêt du programme.
Essaye de l’exécuter normalement (en laissant le compteur filer) puis recommence en fermant le programme avant la fin du décompte.
Re: thread appelle une procedure
Publié : mer. 19/oct./2016 15:59
par Marc56
OpenWindow() can only be called from the main thread.
Une solution:
Code : Tout sélectionner
; Ouvrir une fenêtre depuis un thread
; La fenêtre 2 est générée hors thread en mode invisible
; Le thread la rend visible
; --- Fenêtre principale
OpenWindow(0, 0, 0, 500, 300, "First",
#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; --- Seconde fenêtre (invisible lors de la création: #PB_Window_Invisible)
OpenWindow(1, 0, 0, 250, 450, "Second",
#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)
TextGadget(#PB_Any, 10, 10, 200, 30, "On me demande ? j'étais derrière.")
Procedure MaProcedureThread(*Valeur)
Delay(3000)
HideWindow(1, #False)
Delay(3000)
HideWindow(1, #True)
EndProcedure
CreateThread(@MaProcedureThread(), 23)
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
Mais on doit pouvoir faire mieux avec les sémaphores etc
(les threads, j'y connais pas grand chose)

Re: thread appelle une procedure
Publié : mer. 19/oct./2016 16:43
par Zorro
un thread, devrait rester pour une chose bourrin a faire
genre:, calculs, traitements dans des listes, tableau,analyses diverse etc ...
pas pour des trucs evolués genre ouvrir une fenetre ou jouer du son !
si tu veux faire des trucs evolué, prefere le timer
