Problème arrête de compilation d'un thread aprés fonction.

Résolu
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 - Modifié par vico8000 le 5/09/2016 à 11:32
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 - 7 sept. 2016 à 09:38
Bonjour,

J'ai, depuis maintenant plusieurs jours, un problème qui me laisse sans réponse. C'est pour cela que je viens donc solliciter votre aide.
Je développe une application utilisant un Thread. (Jusques la, rien d'extraordinaire.)
Ce thread fait appel a des fonctions présentes sur une autre fiche. (Toujours rien d’exceptionnel.)
Mon Thread s’exécute correctement lorsque je fais des tests de traitement courts. (C'est plutôt un bon début.)
Quand je veux faire mon traitement réel, qui s'avère être très long, (traitement sur fichiers, plusieurs minutes.) mon thread se lance, effectue le premier traitement, et décide de s’arrêter avant la fin de la fonction. Il ne continue plus son travail.
Vous pourriez me dire, le problème ne viendrait il pas de ta fonction ? La réponse est non ! J'ai testé le code que j'ai dans mon thread, à l'aide d'un bouton, et la, le traitement s'effectue du début à la fin, sans interruption.
Je n'arrive donc pas a comprendre ce qu'est le problème.
Pour ceux qui penserait que mon Thread se lance de façon trop rapproché, il s'exécute toutes les heures, donc le problème ne vient pas de la non plus.
Pour ceux qui auraient l'amabilité de m'aider, je reste à votre entière disposition si vous avez besoin d'informations complémentaires (Code principalement).

Par avance, merci, Cordialement.

4 réponses

vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
5 sept. 2016 à 13:08
Autant pour moi, le problème ne vient pas de mon Thread mais de ma procédure.
Elle s’arrête en pleine exécution. (Parfois avec une violation d'accés)
Le problème n’apparaît pas tout le temps.

Voici la procédure causant le problème

PROCEDURE traitement.CreationFichier(Test : Integer ; SelectionFour : String ; RecupDate : Integer ; Adresse : String);
var
Fusion, SuppCarac, FormatDate : String;
j, k, l, Transformation, RecuperationDate, Conversion2: Integer;
myFile2, FileEvent : TextFile ;
FileData, TabEvent : Array of String;
TabTraitement : Array of Integer;

BEGIN
J:=0;

inc(RecupDate,1);

//Ouverture du fichier CR jour
SL := TStringList.Create;
if test = 1 then SL.Text := StringReplace(DatetoStr(date), '/', #13#10, [rfReplaceAll]);
if test = 0 then SL.Text := StringReplace(DatetoStr(Yesterday), '/', #13#10, [rfReplaceAll]);

Conversion := strtoint(SL[2]) - 2000;
Conversion := conversion * 10000 + strtoint(SL[1]) * 100 + strtoint(SL[0]);

if not DirectoryExists(Adresse + '\SertF' + SelectionFour + '\Dossier_' + inttostr(Conversion)) then
if not CreateDir(Adresse + '\SertF' + SelectionFour + '\Dossier_' + inttostr(Conversion)) then
raise Exception.Create('Problème de création de fichier.');

Setlength(FileData, 1000000);
Setlength(TabEvent, 5000);

IF isFileinUse(Adresse + '\SertF' + SelectionFour) = True THEN ShowMessage ('Fichier en cours d''utilisation')
ELSE
BEGIN
AssignFile(myFile2, Adresse + '\SertF' + SelectionFour + '\Fichier_BDD.txt');
Reset (myFile2);
END;

AssignFile(FileEvent, Adresse + '\SertF' + SelectionFour + '\Event'+ inttostr(Conversion) + '.txt');
Reset (FileEvent);

WHILE NOT Eof(myFile2) DO
BEGIN
ReadLn(myFile2, Stg);
FileData[j] := Stg;
inc(j,1);
END;

j:=0;

WHILE NOT Eof(FileEvent) DO
BEGIN
ReadLn(FileEvent, Stg);
TabEvent[j] := Stg;
inc(j,1);
END;

CloseFile(myFile2);

IF isFileinUse(Adresse + '\SertF' + SelectionFour ) = True THEN ShowMessage ('Fichier en cours d''utilisation')
ELSE
BEGIN
AssignFile(myFile, Adresse + '\SertF' + SelectionFour + '\CR' + inttostr(Conversion) + '.txt');
Reset (myFile);
END;

//Création du fichier CR unique
AssignFile(newFile, Adresse + '\SertF' + SelectionFour + '\Fichier_Tempo.txt');
Rewrite(newFile);

ReadLn(myFile, Stg);

if Stg = '' then ShowMessage('Erreur de lecture, Fichier vide');
Reset (myFile);

Fusion := FileData[RecupDate-6];

j:=0;

setlength(tabtraitement, 25);

//tant que nous ne sommes pas en fin de fichier
WHILE NOT Eof(myFile) DO
BEGIN
ReadLn(myFile, Stg);
//Découpage repéré par la ligne de bilan apprentissage
IF (Stg = '/11************************* BILAN APPRENTISSAGE 1***************** ' ) THEN
BEGIN
CloseFile(newFile);

AssignFile(newFile, Adresse + '\SertF' + SelectionFour + '\Dossier_' + inttostr(Conversion) + '\Fichier_'+ FileData[RecupDate] + '.txt');
Rewrite(newFile);
WriteLN(newFile, FileData[RecupDate-1]);
WriteLN(newFile, '');
WriteLN(newFile, 'Numéro de PM: ' + FileData[RecupDate+2]);
WriteLN(newFile, 'Numéro de lancement: ' + FileData[RecupDate+3]);
WriteLN(newFile, '');

if (FileData[RecupDate+1] <> '0') and (FileData[RecupDate+1] <> '') then
BEGIN
for L := 0 to 25 do Tabtraitement[L] := 0;
k:=j+strtoint(FileData[RecupDate+1]);
inc(k,1);
while j<k do
Begin
if TabEvent[j] = '/1002053' then Inc(Tabtraitement[0],1)
else if TabEvent[j] = '/4002311' then Inc(Tabtraitement[1],1)
else if TabEvent[j] = '/0002275' then Inc(Tabtraitement[2],1)
else if TabEvent[j] = '/0052275' then Inc(Tabtraitement[3],1)
else if TabEvent[j] = '/1002155' then Inc(Tabtraitement[4],1)
else if TabEvent[j] = '/4002316' then Inc(Tabtraitement[5],1)
else if TabEvent[j] = '/0052277' then Inc(Tabtraitement[6],1)
else if TabEvent[j] = '/0002277' then Inc(Tabtraitement[7],1)
else if TabEvent[j] = '/4002309' then Inc(Tabtraitement[8],1)
else if TabEvent[j] = '/0052062' then Inc(Tabtraitement[9],1)
else if TabEvent[j] = '/0002262' then Inc(Tabtraitement[10],1)
else if TabEvent[j] = '/1002041' then Inc(Tabtraitement[11],1)
else if TabEvent[j] = '/0052041' then Inc(Tabtraitement[12],1)
else if TabEvent[j] = '/0052286' then Inc(Tabtraitement[13],1)
else if TabEvent[j] = '/0002286' then Inc(Tabtraitement[14],1)
else if TabEvent[j] = '/1002044' then Inc(Tabtraitement[15],1)
else if TabEvent[j] = '/0052044' then Inc(Tabtraitement[16],1)
else if TabEvent[j] = '/1002060' then Inc(Tabtraitement[17],1)
else if TabEvent[j] = '/0052060' then Inc(Tabtraitement[18],1)
else if TabEvent[j] = '/1002284' then Inc(Tabtraitement[19],1)
else if TabEvent[j] = '/0052284' then Inc(Tabtraitement[20],1)
else if TabEvent[j] = '/1052282' then Inc(Tabtraitement[21],1)
else if TabEvent[j] = '/0002282' then Inc(Tabtraitement[22],1)
else if TabEvent[j] = '/1002300' then Inc(Tabtraitement[23],1)
else if TabEvent[j] = '/0052300' then Inc(Tabtraitement[24],1)
else if TabEvent[j] <> '' then WriteLN(newFile, TabEvent[j]);
inc(j,1);
End;
if tabtraitement[0] <> 0 then WriteLN(newFile, 'Débordement en automatique | x' + inttostr(Tabtraitement[0]));
if tabtraitement[1] <> 0 then WriteLN(newFile, 'Reset Apprentissage | x' + inttostr(Tabtraitement[1]));
if tabtraitement[2] <> 0 then WriteLN(newFile, 'Mesure LaserNum OK | x' + inttostr(Tabtraitement[2]));
if tabtraitement[3] <> 0 then WriteLN(newFile, 'Défaut Mesure LaserNum | x' + inttostr(Tabtraitement[3]));
if tabtraitement[4] <> 0 then WriteLN(newFile, 'Arrêt Remplissage auto, Temps de coulée trop long ou court | x' + inttostr(Tabtraitement[4]));
if tabtraitement[5] <> 0 then WriteLN(newFile, 'Changement Busette | x' + inttostr(Tabtraitement[5]));
if tabtraitement[6] <> 0 then WriteLN(newFile, 'Laser ON | x' + inttostr(Tabtraitement[6]));
if tabtraitement[7] <> 0 then WriteLN(newFile, 'Laser OFF | x' + inttostr(Tabtraitement[7]));
if tabtraitement[8] <> 0 then WriteLN(newFile, 'Reset jeu | x' + inttostr(Tabtraitement[8]));
if tabtraitement[9] <> 0 then WriteLN(newFile, 'Vérin ON | x' + inttostr(Tabtraitement[9]));
if tabtraitement[10] <> 0 then WriteLN(newFile, 'Vérin OFF | x' + inttostr(Tabtraitement[10]));
if tabtraitement[11] <> 0 then WriteLN(newFile, 'Communication CC2 -> Caméra de coulée arrêtée | x' + inttostr(Tabtraitement[11]));
if tabtraitement[12] <> 0 then WriteLN(newFile, 'Communication CC2 -> Caméra de coulée OK | x' + inttostr(Tabtraitement[12]));
if tabtraitement[13] <> 0 then WriteLN(newFile, 'Fin collage Quenouille | x' + inttostr(Tabtraitement[13]));
if tabtraitement[14] <> 0 then WriteLN(newFile, 'Collage Quenouille | x' + inttostr(Tabtraitement[14]));
if tabtraitement[15] <> 0 then WriteLN(newFile, 'SurTempérature moteur Quenouille | x' + inttostr(Tabtraitement[15]));
if tabtraitement[16] <> 0 then WriteLN(newFile, 'Fin SurTempérature moteur Quenouille | x' + inttostr(Tabtraitement[16]));
if tabtraitement[17] <> 0 then WriteLN(newFile, 'Fermeture d''urgence Quenouille | x' + inttostr(Tabtraitement[17]));
if tabtraitement[18] <> 0 then WriteLN(newFile, 'Fin Fermeture d''urgence Quenouille | x' + inttostr(Tabtraitement[18]));
if tabtraitement[19] <> 0 then WriteLN(newFile, 'Défaut recopie position X poche coulée | x' + inttostr(Tabtraitement[19]));
if tabtraitement[20] <> 0 then WriteLN(newFile, 'Fin défaut codeur X | x' + inttostr(Tabtraitement[20]));
if tabtraitement[21] <> 0 then WriteLN(newFile, 'Actionneur positionnement X ON | x' + inttostr(Tabtraitement[21]));
if tabtraitement[22] <> 0 then WriteLN(newFile, 'Actionneur positionnement X OFF | x' + inttostr(Tabtraitement[22]));
if tabtraitement[23] <> 0 then WriteLN(newFile, '? | x' + inttostr(Tabtraitement[23]));
if tabtraitement[24] <> 0 then WriteLN(newFile, '? | x' + inttostr(Tabtraitement[24]));
WriteLN(newFile, '');
END
ELSE if (FileData[RecupDate+1] = '0') then
BEGIN
WriteLN(newFile, 'Pas d''évènement sur Moule.');
WriteLN(newFile, '');
END
ELSE
Begin
WriteLN(newFile, 'Pas de données sur Moule en base de données.');
WriteLN(newFile, '');
End;
inc(RecupDate,6);

END;
SuppCarac := '';
for L := 4 to length(stg) do SuppCarac := SuppCarac + stg[L];
WriteLN(newFile, SuppCarac);
END;

CloseFile(FileEvent);
CloseFile(myFile);
CloseFile(newFile);

if test = 1 then SL.Text := StringReplace(DatetoStr(Yesterday), '/', #13#10, [rfReplaceAll]);
if test = 0 then SL.Text := StringReplace(DatetoStr(Yesterday-1), '/', #13#10, [rfReplaceAll]);

Conversion := strtoint(SL[2]) - 2000;
Conversion := conversion * 10000 + strtoint(SL[1]) * 100 + strtoint(SL[0]);
if FileExists (Adresse + '\SertF' + SelectionFour + 'Dossier_' + inttostr(Conversion) + '\Fichier_'+ Fusion + '.txt') then
Begin
//Ouverture du premier fichier et du dernier du jour précedent
AssignFile(myFile , Adresse + '\SertF' + SelectionFour + 'Dossier_' + inttostr(Conversion) + '\Fichier_'+ Fusion + '.txt');
Append(myFile);
AssignFile(newFile, Adresse + '\SertF' + SelectionFour + '\Fichier_Tempo.txt');
Reset (newFile);

//Parcours du fichier le plus récent pour collage dans le fichier le plus ancien
//Permet de pouvoir associer les premiers et derniers evenements qui sont en lien
WHILE NOT Eof(newFile) DO
BEGIN
ReadLn(newFile, Stg);
WriteLN(myFile, Stg);
END;

//Supprime le fichier qui a été collé sur le fichier précedent
Filedelete := Adresse + '\SertF' + SelectionFour + '\Fichier_Tempo.txt';
deletefile(Filedelete);

CloseFile(myFile);
CloseFile(newFile);
End;
END;


Le problème apparaît dans la boucle
IF (Stg = '/11************************* BILAN APPRENTISSAGE 1***************** ' )
.
Je ne comprend pas l'origine de ce dernier, sachant qu'il n'est pas tout le temps présent.
0
Salut,
Il y a des variables déclarés apparemment dans la procédure et d'autre non...NewFile,MyFile,Stg,SL,RecupDate etc...donc qui prend la main sur la variable dans un thread...Par exemple la variable SL est créée mais jamais libérer, il manque donc les balises Try et Finally...Le Setlength(TabEvent, 5000) à la volé c'est vilain, le mieux est quand même de dimensionner le tableau au besoin...en plus lui peu bloqué aussi le processus quand on arrive à 5000...d'ailleurs pourquoi dimensionner un array of string...
En survolant le code voilà quelques pistes qui peuvent bloquer l'exécution.
@+
0
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
6 sept. 2016 à 11:06
Bonjour,

Merci de te pencher sur mon problème.

Je n'ai pas posé l'intégralité de mon code. C'est pour ça que tu ne vois pas la déclaration des variables. Ce sont des variables publiques.
Pour la libération de SL, il me semble que je le faisais mais que ça me posait problème. Je vais refaire un essaie de ce coté la.
Try/Finally à quel niveau? Je ne connait pas trop ces balises.

En quoi mon Setlength est vilain ? Je l'ai dimensionner à 5000 parce que je suis sur de ne jamais atteindre ce seuil. Mon fichier qui va renseigner ce tableau fait une grandeur de 2000-3000 lignes grand maximum. (Avec beaucoup de problemes dans la journée), c'est pour cela que j'avais mis 5000 pour me prévoir une marge.
J'en ai besoin tous le temps.
Serait'il plus judicieux de compter mon nombre de ligne dans mon fichier et de dimensionner mon tableau par rapport au retour? (La réponse est oui je pense mais en ne sais jamais parce que ça me fait effectuer un traitement de plus pour compter mon nombre de lignes donc ...)
Pourquoi le dimensionner ? Je fais faire un essaie sans le dimensionner et voir.

Encore merci.
0
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
7 sept. 2016 à 09:38
Problème résolue. Le problème etait du à une fonction qui ne marchait pas correctement et faisait planter le thread.

Cordialement.
0
Rejoignez-nous