Clercq
Messages postés19Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention14 juin 2006
-
9 juin 2006 à 17:14
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
21 juin 2006 à 23:02
Bonjour,
Dans la famille probleme de debutant je demande le graphique...
Voili voilou, pour faire mon graphique je lis dans un fichier les valeurs à afficher dans le graphe. Mais aussi incroyable que cela puisse etre, à partir d'une certaine valeur constante le programme plante .... alors qu'avec des valeur = ou > dans le meme fichier (valeur donc variable :p) ça marche .... vous pouvez me dire pourquoi ?
procedure TForm3.CheckBox1Click(Sender: TObject);
var
Fichier : TextFile;
bufVal : string;
bufHeure : string;
oDial : boolean;
begin
if CheckBox1.Checked = True then
begin
OpenDialog1.initialDir := '.\save';
oDial := OpenDialog1.Execute;
if not (OpenDialog1.FileName = '') then
begin
AssignFile(Fichier, OpenDialog1.FileName);
Reset(Fichier); // Ouverture en mode lecture
With Chart1 do
begin
while not Eof(Fichier) do
begin
Readln(Fichier,bufHeure);
Readln(Fichier, bufVal);
Series1.Add(StrToInt(bufVal),bufHeure);
end;
end;
Series1.Active := True;
end;
if (OpenDialog1.FileName = '') or not oDial then
begin
// ShowMessage('Veuillez ouvrir un fichier');
CheckBox1.Checked := False;
end;
end;
if CheckBox1.Checked = False then
begin
Series1.Clear;
Series1.Active := False;
end;
end;
procedure TForm3.CheckBox2Click(Sender: TObject);
var
Fichier : TextFile;
bufVal : string;
bufHeure : string;
oDial : boolean;
begin
if CheckBox2.Checked = True then
begin
OpenDialog1.initialDir := '.\save';
oDial := OpenDialog1.Execute;
if not (OpenDialog1.FileName = '') then
begin
AssignFile(Fichier, OpenDialog1.FileName);
Reset(Fichier); // Ouverture en mode lecture
With Chart1 do
begin
while not Eof(Fichier) do
begin
Readln(Fichier,bufHeure);
Readln(Fichier, bufVal);
Series2.Add(StrToInt(bufVal),bufHeure);
end;
end;
Series2.Active := True;
end;
if (OpenDialog1.FileName = '') or not oDial then
begin
CheckBox2.Checked := False;
end;
end;
if CheckBox2.Checked = False then
begin
Series2.Clear;
Series2.Active := False;
end;
end;
procedure TForm3.ButtonExitClick(Sender: TObject);
begin
close;
end;
end.
(le fichier .save (un vulgaire fichier texte) est generer grave à une thread qui lit les valeur par RS232, les valeur peuvent etre constante ou variable ...)
Clercq
Messages postés19Date d'inscriptionsamedi 18 décembre 2004StatutMembreDernière intervention14 juin 2006 12 juin 2006 à 09:27
Mon probleme n'a rien à voir avec la thread, je ne me rappel pas avoir
nommé mon post de cette manière. Mon probleme viens de la gestion du
graphique c'est tout, m'a thread ecrit bien mon fichier donc rien
a voir.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 12 juin 2006 à 23:25
Je te cite : "(le fichier .save (un vulgaire fichier texte) est generer grave à une thread qui lit les valeur par RS232, les valeur peuvent etre constante ou variable ...)"
Quand deux processus accèdent au même fichier en même temps, il faut savoir gérer les collisions.
Bon, on se penche sur ton problème bientôt.
PS : Merci Ni69
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 21 juin 2006 à 23:02
Bon, on va essayer d'être clair (sans jeu de mots ).
J'ai essayé de reconstituer ton projet avec le peu que tu nous fournis et je n'y suis pas parvenu car il est fait référence à des unités non fournies (pcrInt00, progEnr) dans l'unité threadEnvar.
Permets-moi de te te dire que ton code est très mal écrit puisque tu sembles ignorer que la VCL n'est pas "ThreadSafe" et tu adresses directement des objets (Form1, Form4) dans le corps de la méthode Execute du thread secondaire, au lieu de le faire avec la méthode Synchronize (précisément faite pour cela).
Une des solutions possibles serait de :
1- déclarer tes variables locales à la méthode Execute en tant que membres privés du thread
2- déclarer un constructeur prenant en paramètres deux arguments de type TForm1 et TForm4
et qu'à chaque fois que tu as besoin d'accèder aux fiches, tu le fasses dans le corps de la méthode Synchronize.
Une fois le code en place, si tu le souhaites, nous étudierons la manière de traiter les accès concurrentiels au fichier entre les différents threads (le principal et le secondaire).
Peux-tu nous expliquer pourquoi, dans la méthode Execute, on trouve le code suivant :
terminate;
while not terminated
begin
end;
(En passant, il manque un "do" )
Es-tu sur d'avoir fait fonctionner ton code au moins une fois ou est-ce une malencontreuse erreur de copier/coller ?
Globalement, il y a pas trop de maladresses ou d'erreurs qui font que nous ne pouvons pas te dépanner davantage pour le moment sans y passer des heures à tout remettre en place.
Si tu programmes vraiment dans la catégorie débutants comme tu l'as écrit plus haut, j'ai bien peur que le code ne soit pas encore à ta portée.
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.