Page 1 sur 2

Gestion des évènements dans un Thread

Publié : ven. 07/oct./2005 13:31
par Droopy
Je souhaite gérer les évènements dans un thread, mais ça ne fonctionne pas .

Une idée ?

Code : Tout sélectionner

Procedure GestionDesEvenements()
  Repeat
    a=WaitWindowEvent()
  Until a=#PB_Event_CloseWindow
EndProcedure

CreateThread(@GestionDesEvenements(),"")

OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
Repeat
  Delay(1)
ForEver

Publié : ven. 07/oct./2005 14:14
par Droopy
ça fonctionne comme ça :


si quelqu'un sait pourquoi, je suis preneur

Code : Tout sélectionner

Procedure GestionDesEvenements()
  OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
  Repeat
    a=WindowEvent()
    Delay(1)
  Until a=#PB_Event_CloseWindow
EndProcedure


CreateThread(@GestionDesEvenements(),"")

Repeat
  Delay(1)
ForEver

Publié : ven. 07/oct./2005 15:28
par LeCyb
C'est simple comme bonjour :)

Dans ton exemple tu crées d'abord le thread puis la fenêtre. L'astuce c'est que dès que la commande CreateThread est exécuté le thread est actif et donc essaye d'exécuter la commande WaitWindowEvent, qui plante lamentablement vu que la fenêtre n'est pas encore créée.

Inverse simplement les deux lignes CreateThread et OpenWindows ça fonctionne nettement mieux :D

Publié : ven. 07/oct./2005 17:00
par Heis Spiter
Et pour gérer les évenements dans un Thread, il est plus simple d'utilise la commande WindowCallBack.

Publié : ven. 07/oct./2005 18:53
par Droopy
LeCyb a écrit :C'est simple comme bonjour :)

Dans ton exemple tu crées d'abord le thread puis la fenêtre. L'astuce c'est que dès que la commande CreateThread est exécuté le thread est actif et donc essaye d'exécuter la commande WaitWindowEvent, qui plante lamentablement vu que la fenêtre n'est pas encore créée.

Inverse simplement les deux lignes CreateThread et OpenWindows ça fonctionne nettement mieux :D
Désolé Cyb mais ça marche pas même si on met le thread après la création de la fenêtre.

J'ai essayé avec un Call back et idem ça bug .

Publié : ven. 07/oct./2005 18:55
par Backup
la difference entre tes deux code c'est

Code : Tout sélectionner

  a=WaitWindowEvent()
et

Code : Tout sélectionner

a=WindowEvent() 

WaitWindowEvent() attent qu'un evenement ce soit produit !

alors que WindowEvent() est multitache !!!
c'est donc possible pour les threads !!

avec WaitWindowEvent()
tant que l'evenement n'a pas lieu les threads attendent !
ça block le prg ! :D


d'ailleurs si tu fait une windows screen avec des sprite dedans !
et que tu utilise WaitWindowEvent()

les sprite bougeront seulement lorsque tu bougera la souris !! :D

alors qu'avec WindowEvent() les sprites bougent en multitache !
c'est pourquoi il est courrant de mettre un petit delay(2)
derriere pour pas bouffer tout le temps machine !:D

Publié : ven. 07/oct./2005 20:25
par Droopy
Désolé Dobro, j'ai testé et ça ne marche pas non plus

Code : Tout sélectionner

Procedure GestionDesEvenements() 
  Repeat 
    a=WindowEvent() 
    Delay(1)
  Until a=#PB_Event_CloseWindow 
EndProcedure 

OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window") 
CreateThread(@GestionDesEvenements(),"") 

Repeat 
  Delay(1) 
ForEver

Publié : ven. 07/oct./2005 22:45
par Backup
Droopy a écrit :ça fonctionne comme ça :


si quelqu'un sait pourquoi, je suis preneur

Code : Tout sélectionner

Procedure GestionDesEvenements()
  OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window")
  Repeat
    a=WindowEvent()
    Delay(1)
  Until a=#PB_Event_CloseWindow
EndProcedure


CreateThread(@GestionDesEvenements(),"")

Repeat
  Delay(1)
ForEver

j'ai repondu pour ce code la et pour ta question !

ça me semble normal que ce code fonctionne puisque tu initie la fenetre et sa boucle des events "multitache" ( a=WindowEvent() ) DANS LA MEME procedure :D

dans le code que tu donne en dernier tu separe la boucle d'event de la fenetre , comment veut tu que le system sache a quelle fenetre appartient ta surveillance d'event
puisque celle-ci se trouve dans un thread donc separé de la fenetre
je supose que si l'on cree une fenetre dans une procedure , on ne doit pas pouvoir mettre sa boucle d'event dans une procedure differente !
.... mais c'est juste une suposition , j'ai pas testé !:D

:D

je pense qu'on ne peut separer

Code : Tout sélectionner

OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window") 
de

Code : Tout sélectionner

  Repeat
    a=WindowEvent()
    Delay(1)
  Until a=#PB_Event_CloseWindow 

Publié : sam. 08/oct./2005 7:47
par Droopy
Comme Dobro l'indique , on ne doit pas pouvoir séparer Openwindow de la gestion des evenements, dommage que ce ne soit écrit nulle part .

Publié : sam. 08/oct./2005 11:02
par Backup
d'autant plus domage qu'il existe la fonction

Fenetre = EventWindowID()

qui est sensée donner le numero de fenetre sur laquelle a eu lieu l'event ! :?

mais je supose qu'il sagit des fenetres fille !

Publié : sam. 08/oct./2005 11:04
par nico
Non non, il s'agit bien des fenêtres principales.

Publié : sam. 08/oct./2005 12:36
par lionel_om
C'est quoi l'erreur ??? (j'ai pas PB d'installé là :? )

Essaye de rajouter des conditions :

Code : Tout sélectionner

If IsWindow() ...
Ou rajoute un Sleep_(2000) avant la création du thread, ya peut-être besoin d'atteindre qu'un événement se produise, ou la fenêtre n'ets peut être pas encore totalement créée....


Je dl le code, je testerai chez moi...

Publié : dim. 09/oct./2005 5:47
par filperj
Il y a peut-être qlqchose à faire avec l'api "AttachThreadInput", mais je n'ai pas trouvé comment :?

Publié : dim. 09/oct./2005 6:18
par Droopy
J'ai essayé et ça marche toujours pas :

Code : Tout sélectionner

Procedure GestionDesEvenements(MainId) 
  Debug "ThreadId "+Str(GetCurrentThreadId_())
  AttachThreadInput_(MainId,GetCurrentThreadId_(),#True)
  Repeat 
    a=WindowEvent() 
    Delay(1) 
  Until a=#PB_Event_CloseWindow 
EndProcedure 

OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window") 
Debug "MainId "+Str(GetCurrentThreadId_())
CreateThread(@GestionDesEvenements(),GetCurrentThreadId_()) 

Repeat 
  Delay(1) 
ForEver

Publié : mar. 11/oct./2005 15:07
par Niffo
Et avec un "UseWindow()" ?? (pas testé)