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 :

Multithreading avec TMessage [Syst�me/Fichiers/API]


Sujet :

C++Builder

  1. #1
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par d�faut Multithreading avec TMessage
    Bonjour � tous,

    Suite au sujet Utilisation de RawInput, un nouveau probl�me m'est apparu : Le ressources utilis�es par le traitement.

    Je m'explique, dans ma solution de RawInput, ma fonction WMInput vers laquelle sont redirig�s tout les messages WM_INPUT tourne donc constamment pour effectuer le traitement li� � mes donn�es de souris.

    Le probl�me, c'est qu'une fois le traitement activ�, je ne peux plus rien faire, l'application est comme "fig�e" bien que les valeurs indiqu�es dans mon TEdit se mettent bien � jour.

    J'ai donc fait quelques recherches sur les Threads, j'ai essay� d'int�grer ma fonction de gestionnaire des messages Windows dans ce thread, mais les param�tres de cette fonction �tant des TMessages, apparemment �a n'est pas pris.

    Voici mon code pour cr��r le Thread :

    Unit1.cpp :
    Code C++ : 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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <windows.h>
    #include <winuser.h>
    #include <windef.h>
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    RAWINPUTDEVICE Rid[1];
    HRESULT hResult=0;
    POINT cursor;
    static float X = 0;
    static float Y = 0;
    static float cursorX, cursorY;
    static float K = 0;
    HANDLE hThread;
    DWORD ThreadId;
    int DataThread = 1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	if(Button1->Caption=="Démarrer")
    	{
    		GetCursorPos(&cursor);
    		cursorX = cursor.x;
    		cursorY = cursor.y;
    		Rid[0].usUsagePage = 1;
    		Rid[0].usUsage = 2;
    		Rid[0].dwFlags = RIDEV_NOLEGACY | RIDEV_INPUTSINK;   // adds HID mouse and also ignores legacy mouse messages
    		Rid[0].hwndTarget = Handle;
    		hResult = RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
     
    		if(FAILED(hResult)) ShowMessage("Erreur N°"+GetLastError());
     
    		hThread = CreateThread(NULL, 0, WMInput, &DataThread, 0, &ThreadId);
    		if(hThread==NULL)
    			ExitProcess(DataThread);
     
    		Button1->Caption="Arrêter";
    	}
    	else if(Button1->Caption=="Arrêter")
    	{
    		TerminateThread(hThread, ThreadId); //Stop the Thread
    		Button1->Caption="Démarrer";
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall WMInput(TMessage &Message)
    {
    	UINT dwSize;
     
    	GetRawInputData((HRAWINPUT)Message.LParam, RID_INPUT, NULL, &dwSize,sizeof(RAWINPUTHEADER));
    	LPBYTE lpb = new BYTE[dwSize];
     
    	if (GetRawInputData((HRAWINPUT)Message.LParam, RID_INPUT, lpb, &dwSize,
    		 sizeof(RAWINPUTHEADER)) != dwSize ) {}
     
    	RAWINPUT* raw = (RAWINPUT*)lpb;
    	if (raw->header.dwType == RIM_TYPEMOUSE)
    	{
    		if((int)raw->header.hDevice>65607)
    		{
    			SetCursorPos(cursorX, cursorY);
    			X+= ((raw->data.mouse.lLastX)*2.54)/1000;
    			Y+= ((raw->data.mouse.lLastY)*2.54)/1000;
     
    			K=sqrt((X*X)+(Y*Y));
    			if(X+Y<0)
    				K = -K;
    		}
    		else
    		{
    			GetCursorPos(&cursor);
    			cursorX=cursor.x;
    			cursorY=cursor.y;
    		}
     
    		Form1->Edit1->Text=-K;
    	}
     
    	delete[] lpb;
    }
    //---------------------------------------------------------------------------

    Unit1.h :
    Code C++ : 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
    //---------------------------------------------------------------------------
    #define WM_INPUT 0x00FF
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    	TButton *Button1;
    	TEdit *Edit1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Déclarations utilisateur
    public:		// Déclarations utilisateur
    	__fastcall TForm1(TComponent* Owner);
    	void __fastcall WMInput(TMessage &Message);
    	BEGIN_MESSAGE_MAP
    		MESSAGE_HANDLER(WM_INPUT, TMessage, WMInput)
    	END_MESSAGE_MAP(TForm)
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif


    A la compilation, j'ai cette erreur-ci qui surgit du fin fond des abysses :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    [BCC32 Erreur] Unit1.cpp(47): E2034 Impossible de convertir 'unsigned long (__stdcall * (_closure )(void *))(void *)' en 'unsigned long (__stdcall *)(void *)'
    [BCC32 Erreur] Unit1.cpp(47): E2342 Mauvaise correspondance de type dans le paramètre 'lpStartAddress' ('unsigned long (__stdcall *)(void *)' désiré, 'void' obtenu)

    Suite � ceci, j'en conclu donc qu'avec mon code, il m'est impossible de passer directement ma fonction WMINPUT dans le nouveau Thread, ma question est donc, comment faire pour effectuer cette fonction dans un Thread s�par� du programme principal, afin de ne pas "figer" celui-ci sachant que la fonction est comme une boucle infinie ?

    Cordialement.

  2. #2
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    SetCursorPos !
    Tu modifie la souris pendant le traitement, risque de r�entrance !

    Ajoute dans ton WMInput, un �l�ment � chaque fois, ligne de code par ligne de code, tu d�termineras ce qui provoque la boucle !


    Tu n'as toujours pas compris que la fonction WMInput est appel� par la boucle Application->Run() charg� de lire la file des messages Windows, je pensais te l'avoir expliqu�

    Comment veux tu que le thread devine le TMessage qu'il doit passer en param�tre, un ordinateur n'est pas prescient !

    Tu peux tenter un TThread (classe RTL encapsulant les thread, sous C++Builder autant utiliser la RTL puisque c'est son principal int�r�t)

    Dans le TThread.Execute, tu fais une boucle (Terminated permet son arr�t) et dans cette boucle tu fais appel � WaitMessage\PeekMessage (voir ce code), tu filtre sur le WM_INPUT

    une autre solution, serait de laisser WMInput dans l'�tat, coupl� un TEvent et un TThread.
    WMInput puslerait le TEvent
    le TThread lui se chargerait de GetRawInputData lors de l'�veil de TEvent
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par d�faut
    La souris n'est pas modifi�e, je force simplement la position du curseur � sa position pr�c�dente si la souris de mesure a d�tect� un d�placement.
    Les donn�es que je re�ois sont uniquement les donn�es envoy�es par la souris (enfin d'apr�s ce que j'ai compris).

    Certes cette m�thode est un peu crade, mais pour ce que je cherche � faire, �a marche pas mal, et j'ai rien trouv� d'autre pour que ma deuxi�me souris ne fasse pas bouger le curseur.

    Bref, j'ai regard� un peu comment �a tournait avec l'objet TThread de C++Builder, et j'ai eu l'impression que le Thread ne passait jamais dans le BEGIN_MESSAGE_MAP.

    Du coup, suite � tes propositions, selon toi je devrais mettre dans l'Execute() du Thread :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    PeekMessage(lpMsg, Form1->Handle, WM_INPUT, WM_INPUT, PM_REMOVE);
    Si c'est le cas, en premier param�tre (lpMsg) je dois mettre un lien avec mon traitement de message ?

    J'en profite pour demander un petit truc, toujours en liaison avec RawInput, est-ce que je peux effectuer mon RegisterRawInputDevices sur ma Form1 (en cliquant sur le bouton D�marrer), mais effectuer le traitement et la gestion des messages de ma souris sur le Thread ?

    Parce qu'apr�s plusieurs essais, m�me en mettant un simple ShowMessage dans mon Thread, le programme reste fig� apr�s un click sur le bouton (et donc un RegisterRawInputDevices), alors que les fonctions s�ex�cutent bien.

  4. #4
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par d�faut
    Bon ben finalement j'ai r�ussi � faire fonctionner le tout, c'�tait la ligne Rid[0].dwFlags = NO_LEGACY; qui faisait figer l'API.

    Merci quand m�me d'avoir r�pondu.

    Unit1.cpp :
    Code C++ : 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
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <windows.h>
    #include <winuser.h>
    #include <windef.h>
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    ThreadSouris *Thread;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	if(Button1->Caption=="Démarrer")
    	{
    		Thread = new ThreadSouris(true);
    		Thread->Priority=tpNormal;
    		Thread->Start();
    		Button1->Caption="Arrêter";
    	}
    	else if(Button1->Caption=="Arrêter")
    	{
    		Thread->Terminate();
    		Button1->Caption="Démarrer";
    	}
    }
    //---------------------------------------------------------------------------

    Unit1.h :
    Code C++ : 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
    //---------------------------------------------------------------------------
    #define WM_INPUT 0x00FF
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    	TButton *Button1;
    	TEdit *Edit1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Déclarations utilisateur
    public:		// Déclarations utilisateur
    	__fastcall TForm1(TComponent* Owner);
    	void __fastcall WMInput(TMessage &Message);
    	BEGIN_MESSAGE_MAP
    		MESSAGE_HANDLER(WM_INPUT, TMessage, WMInput)
    	END_MESSAGE_MAP(TForm)
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

    Unit2.cpp :
    Code C++ : 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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <windows.h>
    #include <winuser.h>
    #include <windef.h>
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
     
    //   Important : Les méthodes et les propriétés des objets de la VCL peuvent seulement être
    //   utilisées dans une méthode appelée avec Synchronize, par exemple :
    //
    //      Synchronize(&UpdateCaption);
    //
    //   où UpdateCaption pourrait ressembler à :
    //
    //      void __fastcall ThreadSouris::UpdateCaption()
    //      {
    //        Form1->Caption = "Mis à jour dans un thread";
    //      }
    //---------------------------------------------------------------------------
    static int reg=0;
    RAWINPUTDEVICE Rid[1];
    HRESULT hResult=0;
    POINT cursor;
    static float X = 0;
    static float Y = 0;
    static float cursorX, cursorY;
    static float K = 0;
    //---------------------------------------------------------------------------
    __fastcall ThreadSouris::ThreadSouris(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall ThreadSouris::Execute()
    {
    	//---- Placer le code du thread ici ----
    	while(Form1->Button1->Caption=="Arrêter")
    	{
    		if(reg==0)
    		{
    			GetCursorPos(&cursor);
    			cursorX = cursor.x;
    			cursorY = cursor.y;
    			Rid[0].usUsagePage = 1;
    			Rid[0].usUsage = 2;
    			Rid[0].dwFlags = 0;   // adds HID mouse and also ignores legacy mouse messages
    			Rid[0].hwndTarget = Form1->Handle;
    			hResult = RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
     
    			if(FAILED(hResult)) ShowMessage("Erreur N°"+GetLastError());
    			reg=1;
    		}
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::WMInput(TMessage &Message)
    {
    	UINT dwSize;
     
    	GetRawInputData((HRAWINPUT)Message.LParam, RID_INPUT, NULL, &dwSize,sizeof(RAWINPUTHEADER));
    	LPBYTE lpb = new BYTE[dwSize];
     
    	if (GetRawInputData((HRAWINPUT)Message.LParam, RID_INPUT, lpb, &dwSize,
    		 sizeof(RAWINPUTHEADER)) != dwSize ) {}
     
    	RAWINPUT* raw = (RAWINPUT*)lpb;
    	if (raw->header.dwType == RIM_TYPEMOUSE)
    	{
    		if((int)raw->header.hDevice>65607)
    		{
    			SetCursorPos(cursorX, cursorY);
    			X+= ((raw->data.mouse.lLastX)*2.54)/1000;
    			Y+= ((raw->data.mouse.lLastY)*2.54)/1000;
     
    			K=sqrt((X*X)+(Y*Y));
    			if(X+Y<0)
    				K = -K;
    		}
    		else
    		{
    			GetCursorPos(&cursor);
    			cursorX=cursor.x;
    			cursorY=cursor.y;
    		}
     
    		Form1->Edit1->Text=-K;
    	}
     
    	delete[] lpb;
    }
    //---------------------------------------------------------------------------

    Unit2.h :
    Code C++ : 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
    //---------------------------------------------------------------------------
    #define WM_INPUT 0x00FF
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    //---------------------------------------------------------------------------
    class ThreadSouris : public TThread
    {
    private:
    protected:
    	void __fastcall Execute();
    public:
    	__fastcall ThreadSouris(bool CreateSuspended);
    	void __fastcall WMInput(TMessage &Message);
    };
    //---------------------------------------------------------------------------
    #endif

  5. #5
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Si c'est RIDEV_NOLEGACY qui bloquait
    Du coup, le thread n'est plus utile ?
    J'ai test�, cela fonctionne sans thread avec le 0 dans dwFlags

    je crois que le RIDEV_NOLEGACY, comme le mentionnait d�sactive la souris et donc ton application ne re�oit plus les WM_MOUSE qu'il faut Dispatcher soit-m�me depuis WM_INPUT, je crois que dans l'un des sujet que tu as ouvert, c'�tait minnesota ou AndNotOr qui l'avait expliqu�

    Ce n'�tait pas bloqu� mais juste qu'il ne r�agit pas, car le clavier fonctionne lui sans aucun probl�me, le tab pour naviguer entre Edit1 et Button1 par exemple !



    Quelque remarques sur le code en lui m�me

    Pour ma part, j'utilise VCL_MESSAGE_HANDLER au lieu du MESSAGE_HANDLER
    Pourquoi WMInput n'est pas une m�thode de TForm1 ?
    Cela serait plus pratique !

    J'ai relu ton code, les variables globales, c'est d�gueux, mets en local ou en membre priv� de TForm1 !
    Pourquoi des variables static ? c'est surtout utile dans une fonction pour avoir une sorte de variable locale permanente
    Bon, je suppose que c'est juste un code de test, utiliser le Caption dans un test, ce n'est pas top !


    Pas de ShowMessage, de TForm ou autre �l�ment VCL dans un Thread sans utiliser de Synchronize, c'est � tes risques et p�rils !
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par d�faut
    Oui l� c'�tait juste un test pour vraiment avoir un truc qui marche avant de l'int�grer � mon programme principal, je soignerai bien comme il faut le code en temps voulu, j'ai encore pas mal de temps devant moi avant de terminer.

    Du coup j'ai quand m�me gard� le Thread, j'ai pas essay� avec le dwFlags � 0 sans le Thread, �tant donn� la nature gourmande du traitement principal que j'ai � faire, �a fera pas de mal de rester comme cela.

    Ouais sur le moment j'avais pas compris �a comme �a, j'ai bien saisi le concept tout � l'heure en relisant bien le post sur les deux claviers en Delphi justement. Et j'arrivais �galement � naviguer avec tab mais j'avais pas fait le rapprochement.

    Pour le WMInput, il est bien d�clar� dans TForm1.

    Il y a une r�elle diff�rence entre VCL_MESSAGE_HANDLER et MESSAGE_HANDLER ?

    �a risque quoi si je n'utilise pas Synchronize au juste ?

  7. #7
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Citation Envoy� par chapitre37 Voir le message
    Il y a une r�elle diff�rence entre VCL_MESSAGE_HANDLER et MESSAGE_HANDLER ?
    Aucune id�e

    Citation Envoy� par chapitre37 Voir le message
    �a risque quoi si je n'utilise pas Synchronize au juste ?
    Une violation d'Acc�s qui comme la loi de Murphy le pr�dit ne se produira que chez le client, tu peux aussi avoir OS Error 1400
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2012
    Messages
    58
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 58
    Par d�faut
    Okay donc effectivement vaut mieux bien veiller � utiliser Synchronize (c'est ce que je faisais, mais j'ai vu mon coll�gue qui faisait sans, et �a marchait tout aussi bien, du coup l'id�e de gagner quelques lignes m'a s�duit !), ben en tout cas merci de ces petites pr�cisions !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Multithreading avec section critique ?
    Par Cokate dans le forum C#
    R�ponses: 8
    Dernier message: 25/08/2008, 16h05
  2. Lancer une application multithread avec msdos
    Par SpIrIt505050 dans le forum D�buter avec Java
    R�ponses: 3
    Dernier message: 11/06/2008, 19h47
  3. Multithread avec partage de ressources et join
    Par Razgriz dans le forum Langage
    R�ponses: 4
    Dernier message: 09/05/2008, 10h41
  4. Multithreading avec Visual Basic pour Access
    Par NoViceDel dans le forum VBA Access
    R�ponses: 2
    Dernier message: 12/10/2006, 21h18

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