Gestion des évènements dans un Thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Gestion des évènements dans un Thread

Message 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
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message 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
Vive le thread-safe !
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Et pour gérer les évenements dans un Thread, il est plus simple d'utilise la commande WindowCallBack.
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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 .
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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 .
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Non non, il s'agit bien des fenêtres principales.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Il y a peut-être qlqchose à faire avec l'api "AttachThreadInput", mais je n'ai pas trouvé comment :?
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Niffo
Messages : 108
Inscription : dim. 29/août/2004 15:51

Message par Niffo »

Et avec un "UseWindow()" ?? (pas testé)
Répondre