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 :

Migration vers XE8 difficile


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut Migration vers XE8 difficile
    Bonjour.

    J'utilise une TObjectList dans un TThread afin de dépiler des requêtes vers un web service.
    Ce code fonctionne bien sous Delphi 2010 mais explose avec XE8 et une version d'évaluation de 10.

    Mon thread est censé tourner tant que ma liste n'est pas vide sauf que lorsqu'elle l'est il passe encore sur une condition Liste.Count > 0.
    La preuve en image :
    Nom : Capture3.PNG
Affichages : 119
Taille : 3,7 Ko
    On voit en la liste est vide avec le popup de debug...

    Avez-vous une idée de ce que j'ai pu louper..?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Tillt Voir le message
    Bonjour.

    J'utilise une TObjectList dans un TThread afin de dépiler des requêtes vers un web service.
    Ce code fonctionne bien sous Delphi 2010 mais explose avec XE8 et une version d'évaluation de 10.

    Mon thread est censé tourner tant que ma liste n'est pas vide sauf que lorsqu'elle l'est il passe encore sur une condition Liste.Count > 0.
    La preuve en image :
    Nom : Capture3.PNG
Affichages : 119
Taille : 3,7 Ko
    On voit en la liste est vide avec le popup de debug...

    Avez-vous une idée de ce que j'ai pu louper..?

    Merci
    difficile à dire hors contexte, la liste est-elle mise à jour par plusieurs threads par exemple ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut
    Non je ne pense pas.

    Voici les lignes de code qui concernent cette liste :

    - La création du thread dans mon compo :
    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 TMyComponent.ExecuteRequests;
    var
      Thread: TMyThread;
    begin
      Thread := TMyThread.Create;
      ...
      Thread.OnRequestDone := ThreadRequestDoneEv;
      Thread.OnTerminate := ThreadTerminateEv;
      Thread.OnLog := ThreadLogEv;
     
      Thread.RequestList.AddRequest(RequestType1, RequestObject1);
      Thread.RequestList.AddRequest(RequestType2, RequestObject2);
      Thread.RequestList.AddRequest(RequestType3, RequestObject3);
     
      Thread.Start;
    end;
    - La procédure Execute 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
    procedure TMyThread.Execute;
    var
      Request: TMyRequest;
    begin
      while FRequestList.Count > 0 do
      begin
        if not FProcessing then
        begin
          Request := FRequestList.First;
     
          FProcessing := True;
          DoRequest(Request);
        end;
      end;
    end;
    - L'acquitement de ma requête dans laquelle je supprime la requête dans la liste
    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
    procedure TMyThread.RequestDoneEv(ASender: TObject; ARqType: THttpRequest; AErrCode: Word);
    var
      ...
    begin
      ...
     
      if AErrCode = 0 then
      begin
        FCriticalSection.Enter;
        try
          ...
          if Assigned(FRequestDoneEv) then
            FRequestDoneEv(Request, FRequestList);
        finally
          FCriticalSection.Leave;
        end;
      end
      else
      begin
        ...
      end;
     
      FRequestList.Remove(Request);
      FProcessing := False;
    end;
    Merci pour votre aide.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je vois des choses étranges dans ce code...mais rien qui expliquerait le problème

    pour ce genre de situation j'utilise une technique qui a fait ses preuves

    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
     
    procedure TMyThread.Execute;
    var
      Request: TMyRequest;
    begin
    {$IFDEF LOG}
      AllocConsole; // dans Winapi.Windows
      WriteLn('Début du thread');
    {$ENDIF}
      while FRequestList.Count > 0 do
      begin
    {$IFDEF LOG}
      WriteLn('Count= ',FRequestList.Count,', Processing = ', FProcessing);
    {$ENDIF}
        if not FProcessing then
        begin
          Request := FRequestList.First;
    {$IFDEF LOG}
      WriteLn('Traitement de la requête');
    {$ENDIF} 
          FProcessing := True;
          DoRequest(Request);
    {$IFDEF LOG}
      WriteLn('Fin du traitement');
    {$ENDIF}
        end;
      end;
    {$IFDEF LOG}
      WriteLn('Fin du Thread');
    {$ENDIF}
    end;
    cela permet d'avoir une console avec le déroulement des traitements
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Migration projets C++ Builder XE2 vers XE8
    Par Mercusyo dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/08/2015, 14h52
  2. Migration XE4 vers XE8
    Par Pierre95 dans le forum Débuter
    Réponses: 1
    Dernier message: 27/07/2015, 18h08
  3. Probleme de migration vers serveur dédié
    Par sylvain_neus dans le forum Hibernate
    Réponses: 13
    Dernier message: 23/04/2004, 08h51
  4. [Kylix] migration vers kylix
    Par zheng dans le forum EDI
    Réponses: 1
    Dernier message: 11/04/2004, 08h31
  5. [Tomcat] migration vers une version plus récente
    Par butcher dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 31/10/2003, 21h46

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