incomprehension avec les threads
Re: incomprehension avec les threads
LSI, Comme je dois -- a terme -- faire du thread : il est possible de lire le waitwindowevent dans plusieurs threads ? quels sont les interactions ?
Un même évènement peut-être traité par plusieurs threads ?
Un même évènement peut-être traité par plusieurs threads ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Re: incomprehension avec les threads
Heu non, je te le conseil pas ça 
Chaque thread a sa propre boucle d'évènement si yen a une
sinon tu fait tous planter là
En gros un évènement ne peut pas être traité par plusieur thread
Bref c'est pas possible ça je pense mon cher wathson

Chaque thread a sa propre boucle d'évènement si yen a une
sinon tu fait tous planter là

En gros un évènement ne peut pas être traité par plusieur thread
Bref c'est pas possible ça je pense mon cher wathson

La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !
Mon forum http://purebasic.forumphp3.com/index.php
Mon forum http://purebasic.forumphp3.com/index.php
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: incomprehension avec les threads
La gestion des évènement, je te conseille fortement de la garder dans le programme principal.
Il faut juste placer les opérations longues qui risquent de bloquer le programme principal dans un thread.
Il faut juste placer les opérations longues qui risquent de bloquer le programme principal dans un thread.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: incomprehension avec les threads
En vérité, je dois créer une liste chainée qui contient les messages du bus domotique... tant que je ne les ai pas traités !
Parfois, je dois scanner le bus pour trouver les modules actifs : il faut que je puisse envoyer 255 messages à la vitesse du bus (qui est comparativement faible, soit environ 30 secondes) sans risquer de remplir le buffer (network ou serial).
Je voulais donc envoyer mes messages en thread... et continuer à cliquer dans mon interface (qui peut aussi envoyer des messages) sans perdre de messages en réception mais... pouvoir arrêter le thread (bouton Cancel par exemple).
Le code est tellement long que je ne peux pas le coller ici mais ceux qui s'intéresse peuvent trouver la procédure procipal ici : http://golfy.free.fr/Velbus/Velbus_Teo-Tea.pb
Parfois, je dois scanner le bus pour trouver les modules actifs : il faut que je puisse envoyer 255 messages à la vitesse du bus (qui est comparativement faible, soit environ 30 secondes) sans risquer de remplir le buffer (network ou serial).
Je voulais donc envoyer mes messages en thread... et continuer à cliquer dans mon interface (qui peut aussi envoyer des messages) sans perdre de messages en réception mais... pouvoir arrêter le thread (bouton Cancel par exemple).
Le code est tellement long que je ne peux pas le coller ici mais ceux qui s'intéresse peuvent trouver la procédure procipal ici : http://golfy.free.fr/Velbus/Velbus_Teo-Tea.pb
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: incomprehension avec les threads
oui, ça se prête bien à un thread ceci 
Après ton thread, tu le pilotes avec des variables globales par exemple.
Tu lance ton programme, et il lance le thread
ensuite en global, un mot de départ et un mot pour arrêter la reception emission

Après ton thread, tu le pilotes avec des variables globales par exemple.
Tu lance ton programme, et il lance le thread
ensuite en global, un mot de départ et un mot pour arrêter la reception emission
Code : Tout sélectionner
Procedure MonThread()
Repeat
While Depart = 0
Delay(10)
Wend
Depart = 0
Repeat
; Emission réception de donnée
Until Fin <> 0 or Arret_Programme <> 0
Fin = 0
Until Arret_Programme
EndProcedure
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: incomprehension avec les threads
C'est surtout la procédure ci-dessous que j'aurais voulu "threadé" :
Problème : même en sélectionnant "Activer la gestion des Threads" pour le compilateur, j'ai ensuite des messages d'erreurs POLINK.
J'imagine une bibliothèque (DroopyLib ?) car j'ai besoin d'une fonction qui me donne le nom du PC sur lequel je suis...
Ca m'a un peu refroidi et puis comme j'ai encore des tas de procédures à développer...
Alors pour le moment, j'ouvre juste une fenêtre pour afficher l'état et j'ai une petite boucle pour continuer à lire les messages en provenance du BUS... (LectureNet()).
Code : Tout sélectionner
Procedure Scanbus(Valeur)
; OF FB @@ 40 ## 04
OpenWindow(#Window_2,130,50,200,20,"Scanning...",#PB_Window_Tool,WindowID(#Window_0))
;OldGadgetList = UseGadgetList(WindowID(#Window_2))
TextGadget(#StrScan,10,3,194,14,"Scan N° ")
*Bu= AllocateMemory(256)
For t = 1 To 255
Amodule.s = RSet(Hex(t), 2, "0")
PokeB(*Bu+0,#VBUS_StartX) ; Start
PokeB(*Bu+1,#VBUS_PrioLow) ; Priority Low (FB)
PokeB(*Bu+2,t) ; Address module (00 is broadcast)
PokeB(*Bu+3,$40) ; Data = 0 bytes (RTR)
PokeB(*Bu+4,CheckSum(*Bu,3) ) ; Checksum from h0F to Checksum (not included of course)
PokeB(*Bu+5,#VBUS_EndX) ; ETX (End of Transmission)
Commande$ = Hexa2(*Bu, 5)
SetGadgetText(#StrScan,"Module "+Str(t)+" / 255")
R = AddGadgetItem(#Logs, -0, FormatDate("%dd/%mm/%yy %hh:%ii:%ss",Date())+" --> SCANQ "+Commande$)
R = TxVelbusMsg(ConnectionID, *Bu, 6)
d = ElapsedMilliseconds()
Repeat
EventID = WaitWindowEvent(20)
r = LectureNet()
Until ElapsedMilliseconds()-d > 10
VelbusBPCalc()
Next t
Delay(500)
CloseWindow(#Window_2)
EndProcedure
J'imagine une bibliothèque (DroopyLib ?) car j'ai besoin d'une fonction qui me donne le nom du PC sur lequel je suis...
Ca m'a un peu refroidi et puis comme j'ai encore des tas de procédures à développer...

Alors pour le moment, j'ouvre juste une fenêtre pour afficher l'état et j'ai une petite boucle pour continuer à lire les messages en provenance du BUS... (LectureNet()).
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Re: incomprehension avec les threads
test ça pour voir ?Golfy a écrit : car j'ai besoin d'une fonction qui me donne le nom du PC sur lequel je suis...
Code : Tout sélectionner
Declare.s ReadRegKey(OpenKey.l,SubKey.s,ValueName.s)
CleProce$="SYSTEM\ControlSet001\services\LanmanServer\Parameters"
Debug ReadRegKey(#HKEY_LOCAL_MACHINE,CleProce$,"srvcomment")
Procedure.s ReadRegKey(OpenKey.l,SubKey.s,ValueName.s) ; ====================================== ReadRegKey
; key.s=ReadRegKey(#HKEY_LOCAL_MACHINE,"SOFTWARE\Zone Labs\ZoneAlarm","InstallDirectory")
;
hKey.l=0
KeyValue.s=Space(255)
DataSize.l=255
If RegOpenKeyEx_(OpenKey,SubKey,0,#KEY_READ,@hKey)
KeyValue=""
Else
If RegQueryValueEx_(hKey,ValueName,0,0,@KeyValue,@DataSize)
KeyValue=""
Else
KeyValue=Left(KeyValue,DataSize-1)
EndIf
RegCloseKey_(hKey)
EndIf
ProcedureReturn KeyValue
EndProcedure
; EPB
Re: incomprehension avec les threads
Moi ça me donne une chaine vide 

La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !
Mon forum http://purebasic.forumphp3.com/index.php
Mon forum http://purebasic.forumphp3.com/index.php
Re: incomprehension avec les threads
Celle ci pour ma part ne contient pas le nom de mon PC.Code : Tout sélectionner
CleProce$="SYSTEM\ControlSet001\services\LanmanServer\Parameters"
J'opterai pour
Code : Tout sélectionner
SYSTEM\ControlSet001\services\Tcpip\Parameters
ou plus explicitement :
Code : Tout sélectionner
SYSTEM\ControlSet002\Control\ComputerName\ComputerName
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: incomprehension avec les threads
pas chez moiAr-S a écrit : J'opterai pourLa valeur Hostname renvoie le nom du PC.Code : Tout sélectionner
SYSTEM\ControlSet001\services\Tcpip\Parameters
ou plus explicitement :avec la valeur ComputerNameCode : Tout sélectionner
SYSTEM\ControlSet002\Control\ComputerName\ComputerName

on est mal barré , ya pas de standard j'ai l'impression

Re: incomprehension avec les threads
Bi... bon courage 

La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !
Mon forum http://purebasic.forumphp3.com/index.php
Mon forum http://purebasic.forumphp3.com/index.php
Re: incomprehension avec les threads
Code : Tout sélectionner
InitNetwork()
Debug Hostname()

Je vais chercher d'autres appels à la Lib Droopy (j'ai dû en oublier)

Par contre, sur le post suivant :
http://www.purebasic.fr/english/viewtop ... 19&t=46651
Je n'arrive pas à y accéder (You are not authorised to read this forum.)Update: freak clarified that the host name is not necessarily identical to the computer name:
viewtopic.php?f=24&t=46652&start=1

Edit: la fonction "search" de Google est parfois plus efficace que celle du forum ---> http://www.purebasic.fr/english/viewtopic.php?t=27949
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Re: incomprehension avec les threads
ça arrive en general lorsqu'on essai de lancer (compiller) un programme deja en Ram!j'ai toujours le message POLINK
si tu utilise les Threads , il est donc possible qu'un Thread se lance alors qu'il n'est pas éteint !!
(voir les Mutex pour éviter ça ; ) )
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: incomprehension avec les threads
Il peut s'agir d'une librairie non compatible avec l'option thread.
Il faut que la librairie soit compilé avec l'option Multilib dans TailBite, je ne sais pas comment droopy à compiler sa lib.
Au pire, essaie avec le code source de la lib en include plutôt que la librairie directement pour voir si l'erreur viens de la.
premier conseil : Essai sans aucune lib dans PB pour voir si c'est la cause.
Ensuite, personnellement, je ne mettrai pas la création de fenêtre/gadgets dans le thread mais dans le prog principal.
Après le thread peut faire un HideWindow(), des SetGadgettext(, SetgadgetState(, ou truc du genre
Il faut que la librairie soit compilé avec l'option Multilib dans TailBite, je ne sais pas comment droopy à compiler sa lib.
Au pire, essaie avec le code source de la lib en include plutôt que la librairie directement pour voir si l'erreur viens de la.
premier conseil : Essai sans aucune lib dans PB pour voir si c'est la cause.
Ensuite, personnellement, je ne mettrai pas la création de fenêtre/gadgets dans le thread mais dans le prog principal.
Après le thread peut faire un HideWindow(), des SetGadgettext(, SetgadgetState(, ou truc du genre
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: incomprehension avec les threads
Bon, a part POLINK error "unsolved external symbol '_PB_StringBasePosition', je ne sais pas comment retrouver des instructions qui n'appartiennent pas à Purebasic (mais à une librairie).
1500 lignes (2 fichiers .pb avec un include), ça peut être long et fastidieux... une idée ?
22:18 Ah puis j'oubliai... j'édite et compile sur un Win7 64 bits mais j'ai dû installer une version x86 du compilateur (pour être compatible avec mon serveur)... alors y'a des Lib un peu partout (Program files et program files (x86))...

22:27 Et puis j'ai essayé d'enlever les libs dans les répertoires 'UsersLibraries' sans succès.
22:43 J'ai éliminé la Lib SMTP qui était dans un répertoire subsystem\UserLibThreadSafe, etc... quitté et re-démarré Purebasic : sans succès *grrr*
22:49 Et si je compile sans la coche "Multithread" du compilateur, ça fonctionne toujours (donc plus d'appel vers des lib externes)...
Les 2 fichiers sources :
http://golfy.free.fr/Velbus/Velbus_Teo-Tea.pb
http://golfy.free.fr/Velbus/Tea.pb (main)
1500 lignes (2 fichiers .pb avec un include), ça peut être long et fastidieux... une idée ?
22:18 Ah puis j'oubliai... j'édite et compile sur un Win7 64 bits mais j'ai dû installer une version x86 du compilateur (pour être compatible avec mon serveur)... alors y'a des Lib un peu partout (Program files et program files (x86))...


22:27 Et puis j'ai essayé d'enlever les libs dans les répertoires 'UsersLibraries' sans succès.
22:43 J'ai éliminé la Lib SMTP qui était dans un répertoire subsystem\UserLibThreadSafe, etc... quitté et re-démarré Purebasic : sans succès *grrr*
22:49 Et si je compile sans la coche "Multithread" du compilateur, ça fonctionne toujours (donc plus d'appel vers des lib externes)...
Les 2 fichiers sources :
http://golfy.free.fr/Velbus/Velbus_Teo-Tea.pb
http://golfy.free.fr/Velbus/Tea.pb (main)
Dernière modification par Golfy le mer. 21/mars/2012 22:57, modifié 4 fois.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/