Problème pour réutiliser un stream

Résolu
Utilisateur anonyme - 7 mai 2006 à 15:45
 Utilisateur anonyme - 9 mai 2006 à 23:15
Salut à tous

Voila j'utilise un Timer qui appelle frequemment une procedure de ce type :

Procedure TForm1.BLABLA;
Var
FS1,FS2 : TFileStream;
Begin
FS1:=TFilestream.Create(Edit1.text,fm Create);
FS2:=TFilestream.Create(Edit2.text,fm Create);
Try
FS1.Position:=0;
FS2.Position:=0;
FS2.CopyFrom(FS1,Valeur);
FS2.Seek(0,SoFromBeginning);
Finally
FreeAndNil(FS1);
FreeAndNil(FS2);
end;

Le premier appel se fait bien. Mais après j'ai un gros message d'erreur. Je comprends pk mais je ne sais pas comment corriger cette érreur. Si quelqu'un a une ptite idée ??

A+ et merci

32 réponses

cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
8 mai 2006 à 21:58
For i:=0 to Cursor do
begin
SizeBegin:=SizeBegin+StrToInt(InfoList.Strings[Cursor]);
end;
ImgSize:=StrToInt(InfoList.Strings[Cursor]);

si ton curseur pointe sur l'image 2 cursor = 2
tu additionne 0 + 1 + 2 en size sizebegin pointe sur fin fichier 2
imgsize = taille du fichier 2

FSS.Seek(SizeBegin,SoFromBeginning);

pointe sur fin fichier 2

MS.Seek(0,SoFromBeginning);

MS.CopyFrom(FSS,ImgSize);

copy a partir de fin de l'image jusque fin de l'image + taille image ...

nan ????

Cordialement jfs.
<hr size="2" width="100%">
Tout est en tout et réciproquement ...
3
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
7 mai 2006 à 15:51
C'est une nouvelle procédure aussi Procedure TForm1.BLABLA; lol. Allez je sors... ^^

<hr size="2" width="100%">La paresse est la mère du génie...
0
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
7 mai 2006 à 15:54
Pour la grosse erreur tu es sur que ce n'est pas le fait de recréer à chaque fois? Parceque tu ne libère jamais mais tu créés toujours?
FS1:=TFilestream.Create(Edit1.text,fm Create);
FS2:=TFilestream.Create(Edit2.text,fm Create);

<hr size="2" width="100%">La paresse est la mère du génie...
0
Utilisateur anonyme
7 mai 2006 à 16:00
Si mais je ne sais pas comment faire pour palier le probleme
0

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

Posez votre question
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
7 mai 2006 à 16:02
Pourtant tu as bien
FreeAndNil(FS1);
FreeAndNil(FS2);

donc ça ne devrais pas provoquer d'erreur??? bizarre tout ça...

<hr size="2" width="100%">La paresse est la mère du génie...
0
Utilisateur anonyme
7 mai 2006 à 16:15
Oui je capte pas : je libère le flux donc ca devrait pas planter
0
Abadianet Messages postés 40 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 19 juin 2006 1
7 mai 2006 à 16:18
Si tu ralentis la fréquence de ton Timer, as-tu encore le problème ?
N'as tu un conflit de création du flux sur le même fichier sur un temps trop court ?

A suivre ....

Abadiane
0
Utilisateur anonyme
7 mai 2006 à 16:25
Salut j'ai fais un test en mettant un timer à 2000ms donc ca devrait pas planter malheureusement si
0
Utilisateur anonyme
7 mai 2006 à 16:46
Re



Je précise aussi que sans le timer la procedure fonctionne correctement. Donc le probleme doit venir du stream.



Merci à vous
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
7 mai 2006 à 22:49
salut franky as tu essayer simulant le timer par un bouton?



@+

jlen
0
Utilisateur anonyme
7 mai 2006 à 23:14
Salut JLen,



Oui j'ai mis un bouton à la place du Timer. Lors du second appel cela a planté. Donc je pense que cela vient du stream.



A+ et merci
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
7 mai 2006 à 23:21
je ne vois pas très bien ce qui ce passe essaye de ne créer qu'une
seule fois ton stream dans le programme et regardes si tu plantes sur
un nouvel appel.

NB quel est le message d'erreur?

@+

jlen
0
Utilisateur anonyme
7 mai 2006 à 23:44
Re



l'erreur est : Exception class EJPEG with message 'JPEG error #53'



Voici la procedure entière :



Procedure TForm1.Play(Cursor : longInt);

Var

i,SizeBegin,ImgSize: longInt;

jpg: tjpegimage;

begin

FSS:=TFIleStream.Create(FichEd.text,fmOpenRead);

MS:=TMemoryStream.create;

jpg:= tjpegimage.Create;

SizeBegin:=0;

For i:=0 to Cursor do

begin

SizeBegin:=SizeBegin+StrToInt(InfoList.Strings[Cursor]);

end;

ImgSize:=StrToInt(InfoList.Strings[Cursor+1]);

Try

FSS.Position:=SizeBegin;

MS.CopyFrom(FSS,ImgSize);

MS.Seek(0,SoFromBeginning);

jpg.LoadFromStream(MS);

Visual.Picture.Bitmap.Assign(jpg);

Finally

jpg.free;

FSS.Free;

MS.Free;

end;

end;



Visual est un TImage

InfoList est une stringlist contenant la taille de plusieurs fichiers
images (la c'est bon car j'ai utilisé une listbox pour etre sur).

Les streams sont déclarés comme variables globales.



L'erreur indique un probleme "JPEG" mais ca ne peut pas venir de là. Il
n'y a aucune raison que ca plante lors du second appel. Pour moi c'est
un probleme du stream.



Merci A+
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
8 mai 2006 à 01:16
je pense que le probleme viens de la definition de la taille ou autre ... il se peut que tu oublis un octet au debut ou en fin de fichier ...
a voir.
0
Utilisateur anonyme
8 mai 2006 à 01:34
Salutt fOxi,



C'est pas possible car j'arrive à lire individuellement les images.
Autrement dit si j'utilise manuellement la procedure par un
bouton : je peux mettre n'importe quel valeur à la variable
cursor et cela fonctionne parfaitement. Alors je me suis dis aussi que
c'est peut etre un probleme de rafraichissement du TImage mais je ne
vois pas pk.



A+ et merci

.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 mai 2006 à 10:19
Francky : dans ton prmier code, j'ai un doute sur la valeur de "Valeur".
Alors, si tu pouvais essayer ce code à la place et nous dire quoi :

procedure TForm1.Blabla(const SourceName, Targetname : string);
var
  FS1, FS2: TFileStream;
begin
  FS1 :=  TFilestream.Create(SourceName, fmCreate  or  fmShareDenyNone);
  try
    FS2 : = TFilestream.Create(Targetname, fmCreate or fmShareDenyNone);
    try
      {Pour que la taille du flux copi&#233; soit bonne}
      FS2.CopyFrom(FS1, FS1.Size);
    finally
      FreeAndNil(FS2);
    end;
  finally
    FreeAndNil(FS1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Blabla(Edit1.Text, Edit2.Text);
end;


Pour le reste de ton code, c'est difficile pour nous d'y voir clair dans la mesure où tu utilises des variables globales pouvant être modifiées dans des procédures évènementielles. Si tu pouvais passer des arguments à tes fonctions, ça simplifierait la tâche à tout le monde, y compris à toi

A+
May Delphi be with you !

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Utilisateur anonyme
8 mai 2006 à 10:43
Salut Delphiprog,



Bon j'explique ma source (toute facon je voulais la poster). Lors d'un
topic a été posté :"comment faire un film a partir de photos"'.



Ma stratégie est la suivante. Je fusionne plusieurs documents (la pas
de soucis). J'inclus dans ce fichier créer à la fin la taille des
photos (la je sais que sais bon grace à notepad : je vois les bonnes
tailles avec les bon séparateurs).



Partie vidéo : je lis le fichier grace à un TextFile et je retrouve la
taille des fichiers (la aussi c'est bon) que je place dans une
stringlist. Ensuite je souhaite lire .



Donc je ne peux pas utiliser ta technique Delphiprog car je vais lire tout mon fichier "video" .



Voici mon code :



procedure TForm1.ButAddClick(Sender: TObject);

begin

Opendialog1.execute;

FichEd.text:=Opendialog1.filename;

ListFichiers.Items.add(FichEd.text);

CompteurPhoto1.display:=IntToStr(StrToInt(CompteurPhoto1.display)+1);

visual.Picture.LoadFromFile(FichEd.text);

end;



procedure TForm1.SpeedButton7Click(Sender: TObject);

begin

ListFichiers.Items.delete(ListFichiers.Itemindex);

CompteurPhoto1.display:=IntToStr(StrToInt(CompteurPhoto1.display)-1);

end;



procedure TForm1.ButSaveClick(Sender: TObject);

begin

visual.Picture.SaveToFile(FichEd.text);

end;



procedure TForm1.ListFichiersClick(Sender: TObject);

begin

FichEd.text:=ListFichiers.Items.strings[ListFichiers.Itemindex];

visual.Picture.LoadFromFile(FichEd.text);

end;



procedure TForm1.ButFusClick(Sender: TObject);

Var

i, SizeFile : LongInt;

InfoF : string;

begin

Savedialog1.Execute;

FichEd.text:=Savedialog1.FileName;

InfoF:=#02;

CompteurPhoto2.display:=CompteurPhoto1.display;

FSC:=TFileStream.Create(FichEd.text,fmOpenWrite or fmCreate);

For i:=0 to (ListFichiers.Count-1) do

begin

AddFile(ListFichiers.Items.Strings[i],SizeFile);

InfoF:=InfoF+#01+IntToStr(SizeFile);

CompteurPhoto2.display:=IntToStr(StrToInt(CompteurPhoto2.display)-1);

end;

FSC.Free;

SaveInformation(FichEd.Text,InfoF);

end;



Procedure TForm1.AddFile(AFileName : string; Var Len : LongInt);

begin

FSS:=TFileStream.Create(AFileName,fmOpenRead);

Try

FSS.Seek(0,SoFromBeginning);

FSC.Seek(0,SoFromEnd);

FSC.CopyFrom(FSS,FSS.size);

Finally

Len:=FSS.Size;

FSS.Free;

end;

end;



Procedure TForm1.SaveInformation(NameFile, Line : string);

Var

F : TextFile;

begin

{$I-}

AssignFile(F,NameFile);

Append(F);

WriteLn(F,Line);

CloseFile(F);

{$I+}

end;



procedure TForm1.ButDefusClick(Sender: TObject);

begin

Opendialog1.Execute;

FichEd.text:=Opendialog1.filename;

RecupFile(FichEd.text,SRead );

ExractInfo;

end;



Procedure TForm1.RecupFile(NameFile : string;Var SF : String);

var

FI:File of Char;

Buf:array [1..1024] of Char;

Lu,Taille:LongInt;

begin

SF:='';

{$I-}

AssignFile(FI,NameFile);

Reset(FI);

Taille:=FileSize(FI);

while not Eof(FI) do begin

BlockRead(FI,Buf,1024,Lu);

SF:=SF + string(Buf);

end;

CloseFile(FI);

{$I+}

if Length(SF) > Taille then

begin

SF:=Copy(SF,1,Taille);

end;

end;



Procedure TForm1.ExractInfo;

Var

i: integer;

SReadFinal, aqw : string;

begin

i:=Length(SRead);

While (i>0) and (SRead [i]<>#00) do

begin

SReadFinal :=SRead[i]+SReadFinal;

i:=i-1;

end;

SReadFinal:=Copy(SReadFinal,Pos(#02,SReadFinal)+2,length(SREadfinal))+#01;

Application.ProcessMessages;

InfoList:=TstringList.Create;

InfoList.Add('0');

Repeat

aqw:=Copy(SReadFinal,0,Pos(#01,SReadFinal)-1);

InfoList.Add(aqw);

Application.ProcessMessages;

SReadFinal:=Copy(SReadFinal,Pos(#01,SReadFinal)+1,length(SReadFinal));

Until length(SReadFinal)=0;

showmessage('Extraction finit');

NbImg:=0;

Incr:=1;

end;



Procedure TForm1.Play(Cursor : longInt);

Var

i,SizeBegin,ImgSize: longInt;

jpg: tjpegimage;

begin

SizeBegin:=0;

For i:=0 to Cursor do

begin

SizeBegin:=SizeBegin+StrToInt(InfoList.Strings[Cursor]);

end;

ImgSize:=StrToInt(InfoList.Strings[Cursor]);

Try

FSS:=TFIleStream.Create(FichEd.text,fmOpenRead);

MS:=TMemoryStream.create;

jpg:= tjpegimage.Create;

FSS.Seek(SizeBegin,SoFromBeginning);

MS.Seek(0,SoFromBeginning);

MS.CopyFrom(FSS,ImgSize);

FreeandNil(FSS);

MS.Seek(0,SoFromBeginning);

jpg.LoadFromStream(MS);

Visual.Picture.Bitmap.Assign(jpg);

jpg.Free;

MS.Seek(0,SoFromBeginning);

Finally

FreeandNil(MS);

end;

end;



procedure TForm1.Timer1Timer(Sender: TObject);

begin

timer1.enabled:=false ;

Play(NbImg);

NbImg:=NbImg+1;

timer1.enabled:=true ;

end;



Les variables non déclarées ici sont gloables.



Merci A+
0
Utilisateur anonyme
8 mai 2006 à 11:09
Je viens de me rendre de la stupidité de ma source : a 24 images par
secondes, une minute de video donne 24*60=1140 images soit 1140*3
clicks pour les ajouter. Ben l'utilisateur il va avoir mal au doigt . Je vais peut etre fournir un extincteur avec au cas ou le doigt prend feu.
0
Utilisateur anonyme
8 mai 2006 à 11:12
Par contre j'ai une petite question : Le fait de mettre plusieurs Try a t'il un impact (si on compare nos deux procedures) ?



Merci
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
8 mai 2006 à 11:47
Salut,
juste au passage le message d'erreur que tu nous as donné veut dire que le fichier que tu essayes d'ouvrir (JPEG) n'est un fichier JPG valide : Exception class EJPEG with message 'JPEG error #53'

je pense donc que l'erreur ne provient pas de ta procédure mais du fichier que tu essaye d'ouvrir.

relève le nom du fichier et essaye de l'ouvrir en premier et tu devrais retrouver la même erreur

@+
Cirec
0
Rejoignez-nous