Page 1 sur 1

Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 20:48
par GallyHC
Bonjour,

J’ai un petit problème avec la nouvelle version de Purebasic et avec les « OpenWindows », Bon déjà voila l’erreur :

Code : Tout sélectionner

[20 :13 :18] [ERREUR] ops_message.pbi (Ligne: 125)
[20 :13 :18] [ERREUR] OpenWindow() can only be called from the main thread.
[20 :13 :18] Exécution du programme terminée.
Mais en gros je créer un Thread à partir du « main » de la première fenêtre. Pour pouvoir avoir une fenêtre qui s’ouvre quelque seconde pour une info-toast sans bloquer l’exécution de la fenêtre principale.

Voila le principe (j’ai essayé de condenser mon problème) :

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+



Procedure ouverture(*value)
;
  Define hWnd.i
  Define event.i
  
  hWnd = OpenWindow(#PB_Any, 0, 0, 200, 200, "test", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  If hWnd <> 0
    StickyWindow(hWnd, 1)
    UseGadgetList(WindowID(hWnd))
    Repeat
      ;event   = WaitWindowEvent(50)
      ;If GetActiveWindow() <> WindowID(hWnd)
      ;  event = 0
      ;EndIf
      
    Until event = #PB_Event_CloseWindow
  EndIf
  
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Define hWnd.i
Define event.i
Define MajTread.i

hWnd = OpenWindow(#PB_Any, 0, 0, 200, 200, "test", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
If hWnd <> 0
  ButtonGadget(0, 5, 5, 290, 28, "Test Thread")

  Repeat
    event   = WaitWindowEvent(50)

    If event = #PB_Event_Gadget And EventGadget() = 0
      MajTread = CreateThread(@ouverture(), 0)
    EndIf

  Until event = #PB_Event_CloseWindow
EndIf
J’espère avoir été claire dans mon explication (ce que j’ai moi-même un doute).

Cordialement,
GallyHC

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 20:56
par G-Rom
tu ne peu pas ouvrir des fenêtres dans des threads.

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 21:09
par GallyHC
Avant on pouvait...

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 21:20
par G-Rom
passe par l'api : CreateThread_() , le compilo n'y verra que du feu.

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 21:21
par GallyHC
Pas béte du tout :) j'avous n'y avoir aucunement pensé à celle-la. Merci je vais testé dans ce sens.

Cordialement,
GallyHC

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 21:55
par GallyHC
Re,

Bon le compilo me revois la même erreur même avec "CreateThread_()"

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure ouverture(*value)
;
  Define hWnd.i
  Define event.i
  
  hWnd = OpenWindow(#PB_Any, 0, 0, 200, 200, "test", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  If hWnd <> 0
    StickyWindow(hWnd, 1)
    UseGadgetList(WindowID(hWnd))
    Repeat
      ;event   = WaitWindowEvent(50)
      ;If GetActiveWindow() <> WindowID(hWnd)
      ;  event = 0
      ;EndIf
      
    Until event = #PB_Event_CloseWindow
  EndIf
  
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Define hWnd.i
Define event.i
Define MajTread.i

hWnd = OpenWindow(#PB_Any, 0, 0, 200, 200, "test", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
If hWnd <> 0
  ButtonGadget(0, 5, 5, 290, 28, "Test Thread")

  Repeat
    event   = WaitWindowEvent(50)

    If event = #PB_Event_Gadget And EventGadget() = 0
      MajTread = CreateThread_(0, 0, @ouverture(), 0, 0, 0)
    EndIf

  Until event = #PB_Event_CloseWindow
EndIf
Cordialement,
GallyHC

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 22:03
par Atlante
hello,

Oui, j'ai le même problème que toi sur plusieurs de mes codes.
La loose ^^, je pense qu'il faut modifier l'intégralité et prendre en compte que les threads sont là pour les algos mais non pour l'affichage.
cdt

Atlante

Re: Probleme avec les thread() et OpenWindows()

Publié : lun. 21/janv./2013 22:22
par GallyHC
Hello Atlante,

OK, mais c un très gros programme et cela est vraiment très embétant pour moi. J'avous ne pas comprendre pourquoi on ne peu faire du graphique avec un thread.

Cordialement,
GallyHC

Re: Probleme avec les thread() et OpenWindows()

Publié : mar. 22/janv./2013 8:54
par Mesa
En fait ce code fonctionne à condition de désactiver le débogueur:

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------

DisableDebugger



Procedure ouverture(*value)
;
	Define hWnd.i
	Define event.i
	
	hWnd = OpenWindow(#PB_Any, 0, 0, 200, 200, "test2", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
	If hWnd <> 0
		StickyWindow(hWnd, 1)
		UseGadgetList(WindowID(hWnd))
		Repeat
			;event   = WaitWindowEvent(50)
			;If GetActiveWindow() <> WindowID(hWnd)
			;  event = 0
			;EndIf
			
		Until event = #PB_Event_CloseWindow
	EndIf
	
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Define hWnd.i
Define event.i
Define MajTread.i

hWnd = OpenWindow(#PB_Any, 0, 0, 200, 200, "test", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
If hWnd <> 0
	ButtonGadget(0, 5, 5, 290, 28, "Test Thread")

	Repeat
		event   = WaitWindowEvent(50)

		If event = #PB_Event_Gadget And EventGadget() = 0
			MajTread = CreateThread(@ouverture(), 0)
		EndIf

	Until event = #PB_Event_CloseWindow
EndIf
La doc de openwindow explique le pourquoi:
Note: Une fenêtre ne devrait pas être ouverte dans un thread, car il y a une limitation sur OS X et Linux. Une erreur débogueur sera levée. Quand une fenêtre est ouverte dans un thread, le thread doit appeler WindowEvent() ou WaitWindowEvent() dans une boucle pour gérer les évènements pour cette fenêtre, car les évènements des fenêtres sont propres à chaque thread.
Mesa.

Re: Probleme avec les thread() et OpenWindows()

Publié : mar. 22/janv./2013 13:31
par GallyHC
Bonjour,

Merci pour toutes ces informations, bon je suis sur un code qui respecte mieu la méthode de purebasic :). ça évitera les problème.

Cordialement,
GallyHC