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) :roll:

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 ;)