Probleme avec les thread() et OpenWindows()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Probleme avec les thread() et OpenWindows()

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message par G-Rom »

tu ne peu pas ouvrir des fenêtres dans des threads.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message par GallyHC »

Avant on pouvait...
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message par G-Rom »

passe par l'api : CreateThread_() , le compilo n'y verra que du feu.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Atlante
Messages : 337
Inscription : mer. 29/juin/2011 18:35
Localisation : Paris

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

Message 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
Modérateur
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

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

Message 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.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre