IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Probl�me de synchronisation


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �m�rite
    Avatar de Gouyon
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par d�faut Probl�me de synchronisation
    Bonjour

    J'ai fait un serveur TCP avec le composant TidTCPServer dans une application FMX. Dans la m�thode ServeurExecute je lit les donn�es re�ues et j'en affiche une partie dans une liste box.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    void __fastcall TForm1::ServeurExecute(TIdContext *AContext) {
    	TByteDynArray pInfo;
    	unsigned short data[32 * 25];
    	char chaine[256];
    	try {
    		AContext->Connection->IOHandler->ReadBytes(pInfo, 1856, false);
    		memcpy(chaine, &pInfo[0], 256);
    		memcpy(data, &pInfo[256], 32*25*2);
    		String rep = "";
    		int n = 0;
    		while (n < 256 && chaine[n] != 0) {
    			rep += chaine[n];
    			n++;
    		};
    		updateListe(rep);//rafraichissement de la liste
     
    	}
    	catch (const Exception& e) {
    		// AFAIRE
    	}
    }
    Manifestement la fonction d'affichage ci dessous ne supporte pas d'�tre acc�d� par un thread. Car j'ai r�guli�rement des exceptions qui normalement n'ont pas lieu d'�tre

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TForm1::updateListe(String rep) {
    	lbReseau->Items->Add(rep);
    	if (lbReseau->Items->Count > 10)
    		lbReseau->Items->Delete(0);
    }
    Pour �viter cela, j'ai vu qu'il fallait que j'utilise la m�thode Synchronize mais je n'arrive pas � la mettre en oeuvre.

    En effet j'ai voulu utiliser TIdThread.Synchronize mais il ne veux pas compiler cette ligne.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    TIdThread::Synchronize((TThreadMethod)&updateListe(rep));
    Voici l'erreur E2109 Ce n'est pas un type autoris�

    Une id�e?

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    Salut
    ta mani�re d'utiliser ce composant me semble incorrecte
    je te conseille de regarder le lien suivant:http://codeverge.com/embarcadero.cpp...pserve/1080046
    ou en delphi un code plus complet https://silverpeacock.wordpress.com/...nt-components/
    bien cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  3. #3
    Membre �m�rite
    Avatar de Gouyon
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par d�faut
    Merci pour ces exemples.
    Malheureusement ils ne fonctionnent pas avec FMX.
    L'include #include <IdAntiFreeze.hpp> bloque la compilation avec cette erreur [ilink32 Erreur] Fatal: Impossible d'ouvrir le fichier 'VCL.FORMS.OBJ'
    Sinon j'ai trouv� cette solution:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    //appel de la fonction de mise à jour de la liste des messages
     TThread::Synchronize(NULL, (TThreadMethod)&updateListe);
    fonction de mise � jour des messages
    TClientTCP est un objet cr�� � la connexion et contient les informations � traiter qui on �t� re�ue dans la fonction ServeurExecute.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void __fastcall TScarboMainForm::updateListe() {
    	TClientTCP *clx = NULL;
    	String rep;
     
    	for (int n = 0; n < pClients->Count; n++) {
    		clx = (TClientTCP*)pClients->Items[n];
    		rep = clx->getInfo();
    		if (!rep.IsEmpty()) {
    			lbReseau->Items->Add(rep);
    			if (lbReseau->Items->Count > 10)
    				lbReseau->Items->Delete(0);
    		}
    	}
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void __fastcall TScarboMainForm::ServeurConnect(TIdContext *AContext) {
    	TClientTCP *cl = new TClientTCP(0, AContext);
    	pClients->Add(cl);
    }
    La fonction ServeurExecute
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    void __fastcall TScarboMainForm::ServeurExecute(TIdContext *AContext) {
    	TByteDynArray pInfo;
    	bool trouve = false;
    	int nctx = 0;
    	char chaine[256];
    	TClientTCP *clx = NULL;
    	try {
     
    		while (!trouve && nctx < pClients->Count) {
    			clx = (TClientScarbo*)pClients->Items[nctx];
    			trouve = (clx->getContext() == AContext);
    			nctx++;
    		}
    		if (trouve) {
    			if (clx->getID() == 1 || clx->getID() == 2)
    				AContext->Connection->IOHandler->ReadBytes(pInfo, 17440, false);
    			if (clx->getID() == 3)
    				AContext->Connection->IOHandler->ReadBytes(pInfo, 786688, false);
    			if (clx->getID() == 0)
    				AContext->Connection->IOHandler->ReadBytes(pInfo, 256, false);
     
    			memcpy(chaine, &pInfo[0], 256);
    			String lrep = "";
    			int n = 0;
    			while (n < 256 && chaine[n] != 0) {
    				lrep += chaine[n];
    				n++;
    			}
    			int deb = lrep.Pos("IDENTIFIANT");
    			if (deb > 0) {
    				String num = lrep.SubString(deb + 8, 1);
    				int ref = num.ToInt();
    				if (ref == 1 || ref == 2)
    					clx->setDataBuff(64*64*4);
    				if (ref == 3)
    					clx->setDataBuff(512*512*4);
    				clx->setID(ref);
    				clx->setON(true);
    				TThread::Synchronize(NULL, (TThreadMethod)&updateLed);
    			}
    			else {
    				void *data = clx->getDataBuff();
    				clx->setInfo(lrep);
    				memcpy(data, &pInfo[256], clx->getTailleData());
    				TThread::Synchronize(NULL, (TThreadMethod)&updateListe);
    				TThread::Synchronize(NULL, (TThreadMethod)&updateImg);
    			}
     
    		}
    	}
    	catch (const Exception& e) {
    		// AFAIRE
    	}
    }

  4. #4
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    Salut
    Merci pour le code fournit
    en fait l'include #include <IdAntiFreeze.hpp> n''est pas n�cessaire dans ce cas
    il y aura peut-�tre d'autres erreurs

    par ailleurs l'utilisation de synchronize est d�conseill� car cette m�thode est symchrone et peut bloqu� le thread, il est pr�f�rable d'utiliser la m�thode Queue qui est asynchrone ou un bon vieux PostMessage qui utilise la boucle de Message Windows

    bien cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  5. #5
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    Salut,
    pour revenir � mon pr�c�dent post concernant l'utilisation de TThread::Queue
    j'ai un peu investigu� et voici une solution que je trouve �l�gante
    pour travailler avec les m�thodes Anonymes de Delphi avec C++ Builder il faut mettre en place tout une usine � Gaz en utilisant la classe TCppInterfacedObject

    exemple j'ai besoin envoyer sur le thread principal le nombre de clients connect�s, ainsi que les Traces r�colt�es
    voici le code � utiliser

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    class TNotifier : public TCppInterfacedObject<TThreadProcedure> {
    	int lValue;
    private:
    	TFMicroServer* form;
    public:
    	TNotifier(int ValSet, TFMicroServer* _form) : lValue(ValSet), form(_form) {}
    	INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);
    	void __fastcall Invoke() {form->clients_connected->Text = lValue;}
    } ;
    // ---------------------------------------------------------------------------
     
    class TLogMessage : public TCppInterfacedObject<Classes::TThreadProcedure> {
    	String Msg;
    private:
    	TFMicroServer* form;
    public:
    	TLogMessage(String _Msg, TFMicroServer* _form) : Msg(_Msg), form(_form) {}
    	INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);
     
    	void __fastcall Invoke() {form->messagesLog->Lines->Add(Msg);}
    } ;
     
    // ---------------------------------------------------------------------------
     
    //Ces méthodes seront utilisées de la manière suivante
     
    TThread::Queue(NULL, Classes::_di_TThreadProcedure(new TNotifier(nClients,
    	 this)));
    // notification du nombre de clients
     
    	UnicodeString Tmp("[" + p_sender + "]" + GetNow() + ":" + p_message);
    	TThread::Queue(NULL, Classes::_di_TThreadProcedure(new TLogMessage(Tmp,
    	  this)));
    }
    je suis � disposition en cas de renseignements compl�mentaires
    je joins un code complet fonctionnel en FMX

    bien cordialement
    Fichiers attach�s Fichiers attach�s
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  6. #6
    Membre �m�rite
    Avatar de Gouyon
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par d�faut
    Merci pour le code je vais regarder ce que �a donne chez moi

Discussions similaires

  1. probl�me de synchronisation de thread
    Par youp_db dans le forum Entr�e/Sortie
    R�ponses: 2
    Dernier message: 11/10/2006, 11h34
  2. [VB.net] Probl�me de synchronisation d'une base
    Par WriteLN dans le forum Windows Forms
    R�ponses: 18
    Dernier message: 21/10/2005, 13h11
  3. Probl�me de synchronisation...
    Par sankookai dans le forum MFC
    R�ponses: 10
    Dernier message: 16/02/2005, 14h03
  4. [C#] Probl�me de synchronisation de combobox
    Par WwiloO dans le forum Windows Forms
    R�ponses: 3
    Dernier message: 20/12/2004, 19h56
  5. Probl�me de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    R�ponses: 3
    Dernier message: 21/06/2004, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo