Page 2 sur 3
Re: incomprehension avec les threads
Publié : lun. 19/mars/2012 14:46
par Golfy
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 ?
Re: incomprehension avec les threads
Publié : lun. 19/mars/2012 15:50
par dayvid
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

Re: incomprehension avec les threads
Publié : lun. 19/mars/2012 19:39
par Le Soldat Inconnu
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.
Re: incomprehension avec les threads
Publié : lun. 19/mars/2012 21:34
par Golfy
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
Re: incomprehension avec les threads
Publié : lun. 19/mars/2012 22:15
par Le Soldat Inconnu
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
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
Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 14:05
par Golfy
C'est surtout la procédure ci-dessous que j'aurais voulu "threadé" :
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
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()).
Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 17:02
par Backup
Golfy a écrit :
car j'ai besoin d'une fonction qui me donne le nom du PC sur lequel je suis...
test ça pour voir ?
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
Publié : mer. 21/mars/2012 17:33
par dayvid
Moi ça me donne une chaine vide

Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 17:45
par Ar-S
Code : Tout sélectionner
CleProce$="SYSTEM\ControlSet001\services\LanmanServer\Parameters"
Celle ci pour ma part ne contient pas le nom de mon PC.
J'opterai pour
La valeur
Hostname renvoie le nom du PC.
ou plus explicitement :
avec la valeur
ComputerName
Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 17:56
par Backup
Ar-S a écrit :
J'opterai pour
La valeur
Hostname renvoie le nom du PC.
ou plus explicitement :
avec la valeur
ComputerName
pas chez moi
on est mal barré , ya pas de standard j'ai l'impression

Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 18:07
par dayvid
Bi... bon courage

Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 18:12
par Golfy
Finalement, peut-être pas besoin des libs... par contre je crois que j'ai toujours le message POLINK
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
Update: freak clarified that the host name is not necessarily identical to the computer name:
viewtopic.php?f=24&t=46652&start=1
Je n'arrive pas à y accéder (You are not authorised to read this forum.)
Edit: la fonction "search" de Google est parfois plus efficace que celle du forum --->
http://www.purebasic.fr/english/viewtopic.php?t=27949
Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 18:31
par Backup
j'ai toujours le message POLINK
ça arrive en general lorsqu'on essai de lancer (compiller) un programme deja en Ram!
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 ; ) )
Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 21:23
par Le Soldat Inconnu
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
Re: incomprehension avec les threads
Publié : mer. 21/mars/2012 22:17
par Golfy
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)