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 :

Thread Timer et Tcomposant


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut Thread Timer et Tcomposant
    Bonjour,

    Je cherche à créer un TTimer dans un thread. Comme je n'ai pas de TFrom dans ce thread, je ne sais pas comment définir le paramètre "AOwner: TCompenent" necessaire lors de l'instanciation de l'objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TimerThread: TTimer;
    TimerThread.Create({quoi mettre ici??});
    si je met "self" j'ai une imcompatibilité de type entre le TComponent et le TmyThread.

    Merci.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Par défaut
    Tu mets NIL, et ça devrait passer !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    Merci mais...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TimerThread.Create(nil);
      TimerThread.OnTimer := TimerThreadonTimer;
      TimerThread.Interval := 1000;
      TimerThread.Enabled := true;
    end;
    Pas de problèmes à la compilation mais si je fait un debug pas a pas, il passe directement du TimerThread.Create(nil); au end; de la procèdure...

    une autre idée (ou j'ai fait une connerie peut etre...)

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 079
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 079
    Par défaut
    'Soir,

    Je sais pas si ça a un rapport, mais je regardais l'aide de AllocateHWnd, et dans l'exemple, il est bien montré qu'un Timer a besoin d'une form, invisible mais présente.
    Jette un oeil, des fois que...

    Mes 2 cts,
    --
    jp

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Citation Envoyé par cfalcot
    une autre idée (ou j'ai fait une connerie peut etre...)
    Soit j'ai mal compris soit la création s'écrit comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TimerThread := TTimer.Create(nil);
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par cfalcot
    Bonjour,
    Je cherche à créer un TTimer dans un thread. Comme je n'ai pas de TFrom dans ce thread, je ne sais pas comment définir le paramètre "AOwner:
    ????un timer dans un thréad, bizar,
    dans tt les cas, crée le directement par les API, voir dans l'unité ExtCtrls
    voila un extré de code
    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
    { TTimer }
     
      TTimer = class(TComponent)
      private
        FInterval: Cardinal;
        FWindowHandle: HWND;
        FOnTimer: TNotifyEvent;
        FEnabled: Boolean;
        procedure UpdateTimer;
        procedure SetEnabled(Value: Boolean);
        procedure SetInterval(Value: Cardinal);
        procedure SetOnTimer(Value: TNotifyEvent);
        procedure WndProc(var Msg: TMessage);
      protected
        procedure Timer; dynamic;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property Enabled: Boolean read FEnabled write SetEnabled default True;
        property Interval: Cardinal read FInterval write SetInterval default 1000;
        property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
      end;
     
     
    constructor TTimer.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FEnabled := True;
      FInterval := 1000;
      FWindowHandle := Classes.AllocateHWnd(WndProc);
    end;
     
    destructor TTimer.Destroy;
    begin
      FEnabled := False;
      UpdateTimer;
      Classes.DeallocateHWnd(FWindowHandle);
      inherited Destroy;
    end;
     
    procedure TTimer.WndProc(var Msg: TMessage);
    begin
      with Msg do
        if Msg = WM_TIMER then
          try
            Timer;
          except
            Application.HandleException(Self);
          end
        else
          Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
    end;

  7. #7
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Bien vu edam, je suis aussi de ton avis à 100%

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    Bonsoir,

    Enfait je cherche a threader un transfère de fichier via FTP. Je voudrais faire un timout sur le thread: si il ne s'est pas terminer en 1 minute, je le kill.

    En fait le coup du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Timer1 := TTimer.create(nil);
    fonctionne bien: j'avais mal isolé la ligne de l'erreur....

    Par contre je voudrais liberer mon Timer. Du coup j'essay ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    destructor TMyThread.Destroy;
    begin
      Timer1.Enabled:=false;
      //Timer1.Free; {c'est cette ligne qui pose problème}
      if IdFTPThread.Connected then
        IdFTPThread.Disconnect;
      inherited;
      Memo1.lines.add('THREAD IS DESTROYING...');
      Memo1.lines.Add('');
    end;
    Si je decommante la liberation de mon timer1, des que je click sur une fenètre d'une autre application j'ai l'erreur suivante qui sort:
    Access violation at address 00000000. Read of adress 0000000.
    Par contre tout est bon si je la laisse commanté.

    Je pense que malgrès la destruction du thread, le timer reste cacher quelquepart dans la memoire. En effet, je créer périodiquement mon thread de transfère via FTP. Si je ne desactive pas le timer, lors du premier passage, j'ai un seul 'TIMER' dans mon memo (normal). Lors du second passage j'en ai deux (plus normal), lors du troisième, trois 'TIMER' affichés, etc...

    Voila tout le code pour etre plus clair:
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    procedure TMyThread.Timer1OnTimer(Sender: TObject);
    begin
      try
        Memo1.lines.add('TIMER!');
      Except
        showmessage('ERROR!');
      end;
      Doterminate;
    end;
     
    constructor TMyThread.Create(AIdFTP: TIdFTP; AMemo: Tmemo; AInteger: Integer; AArrayOfString: TTableauDeString1D);
    Var
      I: integer;
    begin
      Timer1 := TTimer.create(nil);
      Timer1.Interval:= 5*1000;
      Timer1.Enabled:= true;
      Timer1.OnTimer := Timer1OnTimer;
      FreeOnTerminate := True;
      IdFTPThread := AIdFTP;
      Memo1 := AMemo;
      NbFichiers := AInteger;
      for I := 0 to NbFichiers - 1 do
        ListeFichiers[I] := AArrayOfString[I];
      inherited Create(False);
      priority := tpLowest;
    end;
     
    destructor TMyThread.Destroy;
    begin
      Timer1.Enabled:=false;
      //Timer1.Free;
      if IdFTPThread.Connected then
        IdFTPThread.Disconnect;
      inherited;
      Memo1.lines.add('THREAD IS DESTROYING...');
      Memo1.lines.Add('');
    end;
     
    procedure TMyThread.Execute;
    begin
      SetName;
      synchronize(TransfereFTP);
    end;
     
    procedure TMyThread.TransfereFTP;
    var
      i: integer;
    begin
      if ServeurFTP.TransferFTP=1 then
      begin
        Memo1.lines.Add(FormatDateTime('[hh:nn:ss]', now)+' connection à '+IdFTPThread.Username+':'+IdFTPThread.Password+'@'+IdFTPThread.host);
        if IdFTPThread.Connected then IdFTPThread.Disconnect;
        try
          try
            IdFTPThread.Connect;
          Except
           Memo1.lines.Add('Le serveur "'+ IdFTPThread.Host + '" ne repond pas');
          end;
          if IdFTPThread.Connected then
          begin
            IdFTPThread.TransferType:=ftBinary;
            for I := 0 to NbFichiers - 1 do
            Begin
              Memo1.Lines.add('Transfère de ' + ListeFichiers[i]);
              try
                IdFTPThread.Put(ListeFichiers[I]);
              Except
                Memo1.lines.Add('   Problème de transfère pour: '+ ListeFichiers[i]);
              end;
            end;
          end;
        finally
          IdFTPThread.Disconnect;
          if IdFTPThread.connected then
            Memo1.lines.add('Problème lors de la deconnection')
          else
            Memo1.lines.add('Déconécté du serveur...');
        end;
      end;
     
      randomize;
      if random > 0.5 then
      begin
        Memo1.lines.add('KILL METHOD MUST BE CALLED...');
        sleep(5*1000);
      end;
     
    end;

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Par défaut
    au fait, merci edam, tu m'a donné les explications sur ce que je n'avais pas réussi à mettre en oeuvre (j'ai trouver un truc similaire dans le forum, mais je ne suis arriver à rien avec...)

  10. #10
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Pour écrire dans une variable extérieure au thread (en l'occurence pour afficher dans memo1), il faut que tu utilise la méthode synchronize du thread :

    Exemple :

    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
    procedure TMyThread.affichage;
    begin
       Memo1.lines.add('THREAD IS DESTROYING...');
      Memo1.lines.Add('');
    end;
     
    destructor TMyThread.Destroy;
    begin
      Timer1.Enabled:=false;
      //Timer1.Free; {c'est cette ligne qui pose problème}
      if IdFTPThread.Connected then
        IdFTPThread.Disconnect;
      inherited;
      Synchronize(Affichage);
    end;

  11. #11
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par edam
    ????un timer dans un thréad, bizar,
    j'ai jamai utlisé les Indys, ci tu as installé cport regard l'uniter cport.pas, il te donnera une idée, en utlisant WaitForMultipleObjects
    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
    procedure TComThread.Execute;
    var
      EventHandles: array[0..1] of THandle;
      Overlapped: TOverlapped;
      Signaled, BytesTrans, Mask: DWORD;
    begin
      FillChar(Overlapped, SizeOf(Overlapped), 0);
      Overlapped.hEvent := CreateEvent(nil, True, True, nil);
      EventHandles[0] := FStopEvent;
      EventHandles[1] := Overlapped.hEvent;
      repeat
        // wait for event to occur on serial port
        WaitCommEvent(FComPort.Handle, Mask, @Overlapped);
        Signaled := WaitForMultipleObjects(2, @EventHandles, False, INFINITE);
        // if event occurs, dispatch it
        if (Signaled = WAIT_OBJECT_0 + 1)
          and GetOverlappedResult(FComPort.Handle, Overlapped, BytesTrans, False)
        then
        begin
          FEvents := IntToEvents(Mask);
          DispatchComMsg;
        end;
      until Signaled <> (WAIT_OBJECT_0 + 1);
      // clear buffers
      SetCommMask(FComPort.Handle, 0);
      PurgeComm(FComPort.Handle, PURGE_TXCLEAR or PURGE_RXCLEAR);
      CloseHandle(Overlapped.hEvent);
      CloseHandle(FStopEvent);
    end;

  12. #12
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    alors, résolut???

Discussions similaires

  1. parametre threading timer
    Par guenaule dans le forum Général Python
    Réponses: 22
    Dernier message: 08/08/2018, 17h40
  2. Exception in thread "Timer-x"
    Par nono44200 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 14/08/2007, 19h24
  3. Thread + timer
    Par Drazharian dans le forum Général Python
    Réponses: 2
    Dernier message: 26/06/2007, 15h14
  4. Thread + Timer CallBack
    Par crevygood dans le forum Windows Forms
    Réponses: 1
    Dernier message: 05/06/2007, 10h44
  5. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51

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