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.