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

Langage Delphi Discussion :

TImage.Repaint depuis un Thread


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut TImage.Repaint depuis un Thread
    Bonjour tout le monde,
    J'expose la partie concernée par le problème:

    J'ai un composant TImage sur lequel je dessine des points aléatoires, ce dessin est effectué depuis un Thread créé par BeginThread. Afin de visualiser la création des points en temps réel, j'appelle donc TImage.Repaint dans la fonction qui dessine le point DrawAgent qui est elle même appelée depuis le Thread en question.

    Le problème est que l'image ne se rafraichie pas (seulement quelques points qui s'affichent) et encore pire, si je survole l'image par une fenêtre, son contenue s'efface completement!

    Bon, si j'effectue la génération des points depuis le Thread principal le problème ne se pose pas!

    Je vous expose quelques bouts de code pour mieux voir :

    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
     
    procedure TCustomMonitor.DrawAgent;
    var ScanArray: PScanArray;
    begin
     with fPreviewImage.Picture.Bitmap do
    	begin
    	 ScanArray:= ScanLine[Y];
    	 with ScanArray[X] do
    		 begin
    			rgbtRed:= GetRValue(AColor);
    			rgbtBlue:= GetBValue(AColor);
    			rgbtGreen:= GetGValue(AColor);
    		 end
    	end;
     fPreviewImage.Repaint
    end;
    Et une portion de la fonction Callback :

    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
     
    function TSchedullerAgentCallbackProc;
    var Msg: TagMsg;
    		Obj: TCustomMonitor;
    		I: Integer;
    		X, Y: Integer;
    begin
     Obj:= TCustomMonitor(AParam);
     with Obj do
    	while GetMessage(Msg, 0, 0, 0) do
    	 case Msg.message of
    		WM_SCHEDULLER_GEN_AGENTS: begin														 
            fActiveAgentCount:= 0;
            fCurrentAgentCursor:= -1;
    	for I := 0 to AgentCount - 1 do
    	begin
    	 X:= Random(fDataArrayWidth -1);
    	 Y:= Random(fDataArrayHeight -1);
    	 TAgent.Create(Obj, X, Y);
    	 DrawAgent(X, Y, fWaitingAgentColor);
    	 if Assigned(fAgentAddEvent) then
              fAgentAddEvent(Obj, fAgentList[Length(fAgentList)- 1])
    	end;
     PostThreadMessage(fSchedullerThreadId, WM_SCHEDULLER_START, 0, 0)															end;
    Une idée ??

  2. #2
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    J'ajoute une réponse par moi même, en réalité c'est un système multi-agents dont la tâche de l'un des agents est d'afficher la progression du traitement sur un contrôle TImage, les autres agents ne fond que des calculs et n'ont aucun accès à la VCL. Donc pour ces derniers, je laisse les Threads créés avec BeginThread par soucis d'optimisation, pour l'agent ayant accès à la VCL, il va dériver de TThread. en principe ça va régler le problème de rafraichissement avec Synchronize.

  3. #3
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    Bonjour,
    Le problème est réglé. Merci pour votre attention.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/02/2007, 09h37
  2. terminer le programme depuis un thread
    Par Tymk dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 04/02/2007, 17h05
  3. Réponses: 2
    Dernier message: 19/12/2006, 22h55
  4. [C#] Instancier un objet Form depuis un Thread
    Par Philipili dans le forum Windows Forms
    Réponses: 10
    Dernier message: 13/05/2006, 13h40
  5. Réponses: 1
    Dernier message: 25/03/2006, 17h53

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