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

Delphi Discussion :

Gif figé


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut Gif figé
    Bonjour,

    Je développe un logiciel avec Delphi 2006 sous WinXP.

    J'ai mis un TjvGifAnimator de la jvcl. Le problème c'est que lors de long traitements, il se fige.

    Le problème c'est que je ne peux pas utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ProcessMessages;
    Pour la simple raison, que ce n'est pas une boucle, mais que c'est un composant qui monopolise le logiciel pendant 0,5sec à 1sec : TIdWhoIs.

    J'ai bien essayé de mettre un TIdAntiFreeze, mais ça ne résoud pas le problème ...

    Je ne sais vraiment pas quoi faire pour que le gif continue à bouger pendant que le TIdWhoIs travail ...

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    dans ce cas, mets la procédure bloquante dans un thread séparé
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Le problème est que cette procédure bloquante fait elle même appel à d'autres procédures sur la fiche.

    Je voulais donc savoir, si l'on peut mettre dans UN thread plusieurs procédure.

    Si non, le meilleur moyen serait il de faire par procédure un thread ? Dans ce cas, on peut appeler un thread dans un autre thread ?

    D'avance merci pour vos réponses

  4. #4
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut appel d'une procédure au sein d'un Thread
    J'ai donc essayé de lancer la boucle dans un Thread et d'y écrire une autre procédure dont j'ai besoin pour cette boucle (Selectionne).

    Mais lorsque je lance la boucle du Thread, il me lance un message d'erreur :

    Project Whois.exe raised exception class EAccessvilolation with message 'Access violation at address 0044C5DF in module 'Whois.exe'. Read of address 00000057'.
    Voici le code du Thread :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    unit UnitThread_Selectionne;
     
    interface
     
    Uses classes, StdCtrls, SysUtils, windows, JvAnimatedImage, JvExControls,
         JvComponent, JvGIFCtrl, JvExExtCtrls, JvImage, JvGIF, JvImageList;
     
    Type
      TThread_Selectionne = class(TThread)
      private
        { Déclaration privées }
      protected
        procedure Execute; override;
        procedure Selectionne(TLD: String);
      public
        constructor Create;
    end;
     
    implementation
     
    Uses Unit1;
     
    constructor TThread_Selectionne.Create;
    begin
      FreeOnTerminate := True;
      inherited Create(False);
    end;
     
    Procedure TThread_Selectionne.Selectionne(TLD: String);
    var
      H: HModule;
      F : Procedure(AString: PChar; ARetVal: PChar; ARetValMax: Integer);
      Nom_Function : String;
     
    begin
      Nom_Function := ('Statut_' + TLD);
     
      //On charge la dll adéquate
      H := LoadLibrary('TLD_Europe.dll');                   //GetModuleHandle(nil);
      if H <> 0 then
      begin
        //On appel la Function adéquate pour obtenir le Statut; pex : Statut_Be
        F := GetProcAddress(H, PChar(Nom_Function));
        if Assigned(F) then
          begin
            //On écrit sur chaque Panel sélectionné le statut du nom de domaine
            (F(PChar(''+Unit1.Form1.Edit_Domaine.Text+''), LResult, SizeOf(LResult)));
     
            //On cache le GifAnimator
            TJvGifAnimator(Unit1.Form1.FindComponent('Unit1.Form1.GifAnimator_' + TLD)).Visible := False;
     
            //On écrit sur chaque Panel sélectionné le nom du domaine recherché
            //avec le TLD correspondant
            TLabel(Unit1.Form1.FindComponent('Unit1.Form1.Label_Domaine_' + TLD)).Caption :=
              LowerCase(Unit1.Form1.Edit_Domaine.Text) + '.' + LowerCase(TLD);
          end;
      end;
    end;
     
    Procedure TThread_Selectionne.Execute;
    begin
      if (Form1.CheckBox_Be.Checked = True) then
        begin
          Selectionne('Be');
        end;
     
      if (Form1.CheckBox_Eu.Checked = True) then
        begin
          Selectionne('Eu');
        end;
    end;
     
    end.
    Voici le code de l'application :

    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
    [...]
     
    implementation
     
    Uses UnitThread_Selectionne;
     
    [...]
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
      Thread_Selectionne : TThread_Selectionne;
     
    begin
      Thread_Selectionne := TThread_Selectionne.Create;
     
    end;
     
    [...]

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    dimensionne LResult avant de lancer le thread
    utilise synchronize pour accéder aux compos de la fiche
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Citation Envoyé par tourlourou
    dimensionne LResult avant de lancer le thread
    Tu veux que je donne le résultat de LResult avant de lancer le Thread ? Ce n'est pas possible, vu que sa valeur va changer pendant l'exécution du Thread.

    En effet, il n'aura pas la même valeur lorsque le premier et deuxième CheckBox vont être sélectionnés.

    Citation Envoyé par tourlourou
    utilise synchronize pour accéder aux compos de la fiche
    J'ai essayé de m'aider de la FAQ http://delphi.developpez.com/faq/?pa...ythreadserveur et des tutoriaux pour rajouter cette commande Synchronize, mais malheureusement il me donne un message d'erreur lors de la compilation ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread_Selectionne.Synchronize(UnitThread_selectionne.TThread_Selectionne);
    E2250 There is no overload version of 'Synchronize' that can be called with these arguments

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

Discussions similaires

  1. Afficher tout type d'image (gif ,png, jpg...)
    Par jfb53 dans le forum C++Builder
    Réponses: 22
    Dernier message: 20/07/2005, 14h52
  2. Conversion automatique de tiffs en jpg/gif
    Par Davenico dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/07/2003, 15h07
  3. [TP] gif et jpeg
    Par vinyl74 dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 22/12/2002, 15h02
  4. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09

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