Prob tracassant avec TMemo

cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004 - 11 mars 2004 à 22:08
cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004 - 13 mars 2004 à 15:04
Salut à tous !

En fait, un petit prob qui me tracasse, j'ai longtemps cherché sur le forum (et sur le net bien sûr) mais je trouve pas, alors si vous pouvez m'aider...

En fait, j'écris une appli client/serveur, je suis le client et j'utilise les composants Indy.
Mon appli marche bien, mon seul prob jusqu'ici, c que j'utilise un TMemo pour récupérer les infos et ensuite je fais mes traitements (pos, copy....), et je vide le Memo régulièrement (lorsque length(Memo1.text)>1024) mais à un moment, mon prog se plante...
C le Memo qui est le prob, ça marche bien jusqu'à 30s (en fait c une boucle qui tourne et remplit le Memo jusqu'à ce que je trouve l'info recherchée, et le vide qd sa taille dépasse 1024), mais au-delà, vers 40s, ça se plante...
Je sais pas si on peut appeler cela de l'overflow, j'ai essayé pas mal de trucs mais je trouve tjrs pas... Y a-t-il une autre propriété qu'il faut utiliser, ou une méthode, ou autre chose ?

Merci d'avance.

11 réponses

cs_christo01 Messages postés 22 Date d'inscription lundi 17 mars 2003 Statut Membre Dernière intervention 17 janvier 2006
12 mars 2004 à 15:18
Salut !

Personnellement, j'ai besoin de plus d'informations.

Si je pouvais voir le source, ça aiderait bien !

Merci
0
cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004
12 mars 2004 à 16:23
Salut christo01

Voici la procédure, j'ai enlevé pas mal de choses non utiles ici, en clair tu as la portion importante qui nous intéresse. Elle montre comment le code agit sur le memo (Memo1), dans une boucle REPEAT... UNTIL...;
On sort de la boucle quand on a trouvé ce qu'on cherche ou lorsqu'on annule. On récupère les réponses du serveur dans le Memo1. Le bug arrive lorsqu'on ne trouve pas l'élément cherché après un certain temps.

Je vide le Memo1 qd sa taille dépasse 1024 mais ça résout pas le prob (j'ai essayé d'augmenter la taille limite, ça n'a pas marché et en plus cela ne serait pas bien pour mes traitements).

Merci de ton aide.
__________________
procedure TForm3_connexionIndy.EnvoyerClick(Sender: TObject);
begin
RadioGroup1.Enabled:=false;
cabine.Enabled:=false;
quantite.Enabled:=false;
if IdTCPClient1.Connected then begin
Repeat
IdTCPClient1.WriteLn('cv'); // envoi requete

try
if Length(Memo1.Text)>1024 then begin // C ICI
Memo1.Clear; // L'ERREUR APRES 30s d'exécution de la boucle
end;
Memo1.Lines.Add(IdTCPClient1.ReadLn); // réception

finally
Screen.Cursor:=crHourGlass;
if pos('Number of Calls: ',Memo1.Text)<>0 then begin
Form3_connexionIndy.Caption:=copy(Memo1.Text,pos('Number of Calls: ',Memo1.Text)+17,2)+' appel(s) en cours, '
+copy(Memo1.Text,pos('Active: ',Memo1.Text)+8,2)+' actif(s)...';
number_calls:=copy(Memo1.Text,pos('Number of Calls: ',Memo1.Text)+17,1)+' appel(s) en cours...';
active_calls:=copy(Memo1.Text,pos('Active: ',Memo1.Text)+8,1);
end;

if pos('Call No.',Memo1.Text)<>0 then begin
reponse:=copy(Memo1.Text,pos('Call No.',Memo1.Text),1024); // ICI ON BOSSE AVEC UNE PARTIE DU TEXTE DU Memo1
appel.Text:=copy(reponse,pos('Call No.',reponse)-8,14);
...
end;
end; // end du try finally...
UNTIL (bool=true) or (cancel=true); // on sort
Screen.Cursor:=crDefault;

end;
end;
____________________
0
cs_christo01 Messages postés 22 Date d'inscription lundi 17 mars 2003 Statut Membre Dernière intervention 17 janvier 2006
12 mars 2004 à 18:18
Salut !

Bon. Déjà je vois mal l'utilité du Try...Finally... C'est peut-être ça le prob. Donc:

Repeat
        IdTCPClient1.WriteLn('cv'); // envoi requete
        if Length(Memo1.Text)>1024 then
          Memo1.Clear;
        Memo1.Lines.Add(IdTCPClient1.ReadLn); // réception
        Screen.Cursor:=crHourGlass;
        if pos('Number of Calls: ',Memo1.Text)<>0 then
          begin
            Form3_connexionIndy.Caption:=copy(Memo1.Text,pos('Number of Calls: ',Memo1.Text)+17,2)+' appel(s) en cours, '
                                                              +copy(Memo1.Text,pos('Active: ',Memo1.Text)+8,2)+' actif(s)...';
            number_calls:=copy(Memo1.Text,pos('Number of Calls: ',Memo1.Text)+17,1)+' appel(s) en cours...';
            active_calls:=copy(Memo1.Text,pos('Active: ',Memo1.Text)+8,1);
          end;
        if pos('Call No.',Memo1.Text)<>0 then
          begin
            reponse:=copy(Memo1.Text,pos('Call No.',Memo1.Text),1024); // ICI ON BOSSE AVEC UNE PARTIE DU TEXTE DU Memo1
            appel.Text:=copy(reponse,pos('Call No.',reponse)-8,14);
          end;
      UNTIL (bool=true) or (cancel=true); // on sort


Et si ça continue, ce serait bien que tu me communique l'erreur annoncée...

Tiens moi au courant !
0
cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004
12 mars 2004 à 18:33
Salut !

Non en fait, ce n'est pas le Try Finally le prob, je l'ai mis après justement que le problème se soit posé, pour essayer de terminer le code avant le déclenchement de l'exception (si je comprends bien sa fonction d'après ce que j'ai lu dans l'aide de Delphi).
Donc on doit chercher ailleurs. Ma question, c comment éviter cette erreur qui arrive au bout d'un moment lorsque le Memo1 continue d'être manipulé.

Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_christo01 Messages postés 22 Date d'inscription lundi 17 mars 2003 Statut Membre Dernière intervention 17 janvier 2006
12 mars 2004 à 18:40
Salut

Mais c'est quel genre d'erreur ? Que dit Delphi ?

Parceque je vois pas... :sad) :sad) :sad) :sad)
0
cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004
12 mars 2004 à 18:50
OK OK
Le message d'erreur, le voici :
"Le projet a provoqué une classe d'exception EIdSocketError avec le message 'Erreur de socket # 0'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer."

L'appli compilée me renvoie effectivement :
"Erreur de socket #0"

Voilà.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 mars 2004 à 18:51
Le bloc try..finally ne peut, en aucun cas, nuire au fonctionnement. On peut toutefois s'étonner que la plus grosse partie du traitement s'effectue entre le finally et le end et non entre le try et le finally. Mais bon, à chacun ses convictions...
En tous cas, l'extrait que tu donnes ne présente pas de défaut apparents.
N'aurais-tu pas, dans un autre thread, un processus qui écrit dans le memo en même temps ?
May Delphi be with you
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 mars 2004 à 18:52
Arf, tu as posté une réponse en même temps. Alors, visiblement, l'erreur ne vient pas du TMemo !
May Delphi be with you
0
cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004
12 mars 2004 à 19:02
Salut Dephiprog !
En fait, j'ai mis le try..finally parce qu'en essayant de résoudre mon prob, j'ai lu un peu dessus dans l'aide de Delphi. Donc, je maîtrise pas encore a priori ses fonctions intrisèques... (pourrais-tu me donner une courte explication pratique ou un lien sur le sujet - merci).

Je n'ai pas mis de thread, je voulais en faire, mais j'ai utilisé le composant IdAntiFreeze pour avoir la main pendant l'exécution de la boucle (en fait, pour pouvoir cliquer sur un bouton Annuler qui met le booléen Cancel à true, et qui permet de sortir de la boucle, comme tu peux le voir dans le source).
Personnellement, je ne trouve aucune explication à ce phénomène, du moment que je "clear" bien le Memo pour éviter un débordement ou overflow (terme exact ?).

Merci et surtout félicitations pour le superbe travail que tu fais sur ce site :)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
13 mars 2004 à 09:57
En attendant, tu peux trouver sur le site de swiss delphi center un chapitre du livre traitant des applications utilisant les composants Indy et la façon de gérer les erreurs de sockets. 8-)
Par la même occasion, regarde bien l'utilisation des blocs de protection. :approve)
May Delphi be with you
0
cs_philippo17 Messages postés 11 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 22 mai 2004
13 mars 2004 à 15:04
Ok, merci Delphiprog, je vais lire ce chapitre, et je te tiens au courant :big)
0
Rejoignez-nous