incomprehension avec les threads

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: incomprehension avec les threads

Message 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 ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: incomprehension avec les threads

Message 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:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: incomprehension avec les threads

Message 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.
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: incomprehension avec les threads

Message 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
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: incomprehension avec les threads

Message 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
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: incomprehension avec les threads

Message 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()).
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: incomprehension avec les threads

Message 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
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: incomprehension avec les threads

Message par dayvid »

Moi ça me donne une chaine vide 8O
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: incomprehension avec les threads

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

Re: incomprehension avec les threads

Message 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:
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: incomprehension avec les threads

Message par dayvid »

Bi... bon courage :mrgreen:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: incomprehension avec les threads

Message 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
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: incomprehension avec les threads

Message 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 ; ) )
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: incomprehension avec les threads

Message 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
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: incomprehension avec les threads

Message 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)
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/
Répondre