Purebasic 5.0 béta 8 Openwindow and switchdesktop

Codes specifiques à Windows
marsu
Messages : 7
Inscription : ven. 16/mai/2008 7:18

Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par marsu »

Bonjour,

dans la béta 8 il est dit :

Note: A window should not be opened in a thread, as there is some limitation on OS X and Linux. A debugger error will be raised.

Cela empêche d'utiliser le debugger alors que sous windows on peut avoir besoin de créer une fenêtre dans un thread.

Exemple :

On crée une application qui utilise plusieurs bureaux (createdesktop), cette appli va créer une ou plusieurs fenêtres pour s'initialiser. Dès lors que le thread principale a créé une fenêtre sur un bureau, il lui est impossible d'utiliser switchdesktop pour creer d'autre fenêtre sur un autre bureau. La solution est de créer un thread , de switcher sur le bureau désiré puis de créer une ou plusieurs fenêtres.

Il serait dommage d'être obliger de se passer du debugger. Ne peut-on pas autoriser la création dans le debugger sur cette plateforme ?

Merci à l'équipe de fantaisie software d'étudier ce problème.
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par Fred »

Tu peux entourer les appels d'openwindow() et waitwindowevent() de disable/enabledebugger si tu veux absolument utiliser ca.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

la seule solution c'est de déactiver le débugger ?

mais comment on peut éviter d'ouvrir des fenêtres dans un thread si on en veux plusieurs qui ne sont pas liées entre elles ?
Ça m'ennuie parce que j'utilise ce truc dans un programme (le seul) que j'ai publié :?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par Fred »

Je ne comprend pas la notion de 'pas liées entre elles'. Quand tu ouvres une fenetre, elle est gérée de manière indépendante, à partir du moment où ta boucle d'événement est appelée. Si tu postes un code, je pourrais jeter un oeil sur ton probleme.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par cederavic »

Je pense qu'il voudrait faire un truc du genre :

Code : Tout sélectionner

Procedure wnd(wndID)
  OpenWindow(wndID, ......)
  
  Repeat
    ; là ça bloque car windowevent() renvera un event sur n'importe quelle fenetre
    ; et on ne peut pas utiliser EventWindow() avant WindowEvent()
    Select WindowEvent()
      Case #WM_CLOSE
        closedWnd = #True
    EndSelect
  Until closedWnd
  
EndProcedure

For i = 0 To 10
  CreateThread(@wnd(), i)
Next

Repeat : Delay(100) : ForEver
L'exemple est inutil dans ce cas là, mais on pourait avoir une proc thread par "type" de fenetres. Elles seraient gérées indépendement les unes des autres sans avoir une proc commune qui s'occupe de recuperer les events de toutes les fenetres et les redispatcher.
D'ailleur, un param optionnel du genre (Wait)WindowEvent([#Window_ID = #PB_Any]) pour recuperer seulement les event d'une fenetre particuliere serait chouette :)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

ouaip, c'est exactement ça, mais avec une chtite différence :

C'est pour mon prog ScMangwa (Lien pour la page)
Je suis assez content car des gens l'utilisent, et le trouvent utile :lol: pour une fois que mes progs sortent du cadre familial !

Donc, j'ai une fenêtre principale qui sert pour la lecture, et avec [F1], on ouvre une fenêtre d'aide.
Au départ cette fenêtre rendait la fenêtre principale inactive, avec la fonction : disablewindow()
Je l'utilise d'ailleurs dans d'autre partie du logiciel pour d'autre raisons.

Cependant, on m'a fait remarqué à juste titre, que la fenêtre d'aide contenant des explications du fonctionnement du programme, il pouvait être intéressant voire très pratique de manipuler les deux fenêtres côtes à côtes.

J'ai donc ma boucle principale avec tout les trucs qu'elle gère, et un thread qui gère ma fenêtre d'aide.
Effectivement, je me suis posé la question de savoir si les event d'une fenêtre étaient attrapés par l'autre. Mais jusqu'à présent tout fonctionne parfaitement, je n'ai pas poussé plus loin.

J'ajoute qu'en considérant le fonctionnement du logiciel, il serait très compliqué de gérer la situation sans utiliser de thread.
Le programme principal se passe la main dans plusieurs procédures consécutives, et faire suivre la gestion de la fenêtre d'aide me semble être une belle usine à gaz.

Si vous voulez voir ce que le logiciel donne, il se télécharge avec le lien plus haut. Pour voir les différents comportements, il suffit de lancer le prog, et sur la page principale faire (lance la bibliothèque). Si cette bibliothèque comporte des items (dans le cas d'un utilisateur), une autre fenetre peut être ouverte avec , ou clic droit sur les items (c'est pour les infos du livre).
Et la fenêtre d'aide peut elle être ouverte de n'importe ou avec [F1], et elle reste là jusqu'à ce qu'on la ferme.

(c'est une stickywindow car comme elle est de type toolwindow, elle n'apparait pas dans la barre des tâches)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par nico »

J'ai donc ma boucle principale avec tout les trucs qu'elle gère, et un thread qui gère ma fenêtre d'aide.
T'as résolu une difficulté qui n'existe pas par une aberration; je suis loin de tout savoir, peut être que la nécessité d'une fenêtre créé dans un thread existe mais ça doit être hyper rare.

Le thread principale et les threads secondaires ne sont pas identiques, il y a des choses que tu ne peut pas faire dans un thread secondaire comme affiché un messagerequester par exemple.

De plus chaque thread possède sa propre file d'attente, lorsqu'un thread secondaire est créé, sa file d'attente n'existe pas, il faut l'initialiser, ce qui signifie que tu as utiliser un thread secondaire pour traiter des messages de la file d'attente du thread principale; elle est là l'aberration, car si tu avais eu besoin de traiter une fenêtre dans un thread, tu aurais utiliser la file d'attente du thread créé évidemment et pas celle de la boucle principale.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

attention là !!

Pour les histoires de file d'attente. la fenêtre est gérée dans le thread, c'est à dire que le thread la créée, la gère , puis la ferme.

Franchement si je devais obtenir le même comportement sans thread, je ne vois pas comment faire sans faire une usine à gaz.

[edit] : j'ai essayé de reproduire le fonctionnement de mon code en isolant les éléments concernés, je ne suis pas arrivé au même résultat...
On obtient ce qu'on devrait attendre.
Du coup je ne comprend pas le fonctionnement du code de mon logiciel, qui lui, sépare les évènements entre la fenêtre d'aide et les autres.
Dernière modification par graph100 le mar. 20/nov./2012 21:55, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par nico »

J'ai fait ce code pour voir si je trouvais un problème,
La fenêtre principal permet d'afficher une seconde fenêtre DialogWindow qui bloque la première et aussi une troisième fenêtre qui représente ton fichier d'aide.

dis moi où se situe ton problème par rapport à cet exemple:

Code : Tout sélectionner

Procedure Dialogwindow()
  If OpenWindow(1, 100, 200, 200, 200, "PureBasic Window 2", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, WindowID(0))

  EndIf
EndProcedure

Procedure Secondwindow()
  If OpenWindow(2, 100, 200, 200, 200, "PureBasic Window 2", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, WindowID(0))

  EndIf
EndProcedure



If OpenWindow(0, 100, 200, 200, 200, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  ButtonGadget(1, 10 ,10 , 100, 20, "Dialog Box")
  ButtonGadget(2, 10 ,60 , 100, 20, "Second Window")
  
  Repeat
    Event = WaitWindowEvent()
    Window = EventWindow() 
    Select Window
      Case 0
        Select event
          Case #PB_Event_Gadget
            Select EventGadget()
              Case 1
                DisableWindow(0, 1)
                Dialogwindow()
                
              Case 2
                Secondwindow()
            EndSelect
            
          Case  #PB_Event_CloseWindow
            Quit = 1
        EndSelect
        
        
      Case 1
        Select event
          Case  #PB_Event_CloseWindow
            CloseWindow(1)
            DisableWindow(0, 0)
        EndSelect
        
       Case 2
        Select event
          Case  #PB_Event_CloseWindow
            CloseWindow(2)
        EndSelect       
        
        
    EndSelect
    
  Until Quit = 1 
EndIf
End   
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

lit mon edit ^^ ( je regarde ce que tu as fait)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

mon soucis, se situe au niveau de la complexité du code.
Quand tu modifies un fichier de 6500 lignes, faut vraiment savoir où sont les morceaux qui t'intéresse.

Ton code est intéressant, je n'ai jamais utilisé EventWindow() jusqu'à présent, je crois même que je viens de découvrir cette commande.
Si je devais recommencer je ne ferais sans doute pas de la même façon, mais dans ce cas précis il y a bcp trop de chose que je dois mettre dans la boucle de traitement principal pour y insérer les autres fenêtres.

On peux pas régler ça avec un select EventWindow() tout propre ...

tant pis. Tant que mon code fonctionne je n'y toucherais pas en profondeur, et si les versions de pb bloque de façon majeur son fonctionnement je resterais à la dernière qui compile.

merci pour vos réponses.
Dernière modification par graph100 le mer. 17/avr./2013 1:47, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

Je cite de l'aide de PB 5.11 pour WindowEvent()
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.
....

Et pourquoi je suis tombé là dessus, parce que j'en ai besoin.
Je ne veux pas passer par une callback, et j'en ai besoin sous windows. Je trouve dommage de remonter une erreur par le débugger alors que c'est un truc qui devrais être comme les callback, spécifique à window.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par nico »

Je ne demande qu'à te croire, donne moi une situation où l'utilisation d'une fenêtre dans un thread est nécessaire.

Il est vrai que c'est dans l'aide mais pour avoir suivi un topic sur le forum anglais, beaucoup se plaignait des erreurs de compilation du debugger qui ne permet pas de faire ça (à moins de désactiver celui ci dans cette portion de code), de plus il a bien été indiqué que si effectivement tu pouvais faire ça pour window, en aucun cas c'était réalisable pour linux ou mac d'où l'erreur du debugger. Pourquoi sur window, il serait nécessaire de faire ce truc alors que sur les autres systèmes, cela n'a jamais été prévu?
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par graph100 »

Je veux faire un truc pendant qu'on bouge une fenêtre. Or le déplacement d'une fenêtre est bloque le programme principale (sur window en tout cas).

Ce que je voudrais simplement souligner, c'est que c'étais possible avant, pourquoi l'enlever ? De plus maintenant désactiver le debugger ne suffit pas, le programme plante.
Je sais bien qu'il faut évoluer, mais je n'aime pas être limité ! C'est bien beau d'être multi-platforme, mais il ne faudrait pas être médiocre sur chacune, non plus...
Chaque OS a des utilisations propres, acceptons les :!:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Purebasic 5.0 béta 8 Openwindow and switchdesktop

Message par nico »

Je veux faire un truc pendant qu'on bouge une fenêtre. Or le déplacement d'une fenêtre est bloque le programme principale (sur window en tout cas).
L'exemple de code que j'ai posté te montre que non; ça doit pas être difficile de poster un exemple simple de ton problème sinon.
Chaque OS a des utilisations propres, acceptons les
Je suis d'accord avec ça, pourquoi on a pas la gestion du registre de window par exemple. On peut très bien utiliser du code spécifique pour une plateforme et du code généraliste pour les autres.
Répondre