thread appelle une procedure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
ChaudEf
Messages : 179
Inscription : dim. 27/déc./2015 17:02
Localisation : Strasbourg

thread appelle une procedure

Message 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
Windows 10 x64 -- Purebasic 5.70 LTS x86
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: thread appelle une procedure

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: thread appelle une procedure

Message 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:
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: thread appelle une procedure

Message 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 ;)
Répondre