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 :lol:

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

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

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... :roll:
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 8O

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

Code : Tout sélectionner

SYSTEM\ControlSet001\services\Tcpip\Parameters
La valeur Hostname renvoie le nom du PC.

ou plus explicitement :

Code : Tout sélectionner

SYSTEM\ControlSet002\Control\ComputerName\ComputerName
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

Code : Tout sélectionner

SYSTEM\ControlSet001\services\Tcpip\Parameters
La valeur Hostname renvoie le nom du PC.

ou plus explicitement :

Code : Tout sélectionner

SYSTEM\ControlSet002\Control\ComputerName\ComputerName
avec la valeur ComputerName
pas chez moi :?
on est mal barré , ya pas de standard j'ai l'impression :roll:

Re: incomprehension avec les threads

Publié : mer. 21/mars/2012 18:07
par dayvid
Bi... bon courage :mrgreen:

Re: incomprehension avec les threads

Publié : mer. 21/mars/2012 18:12
par Golfy

Code : Tout sélectionner

InitNetwork()
Debug Hostname()
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) :wink:

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.) :roll:

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))... :oops: :cry:
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)