Gå til innhold

Anbefalte innlegg

Jeg har et delphi program som emulerer et måleinstrument, det leser en utfil fra instrumentet og skriver det post for post til en annen fil (det interessante er å arbeide videre med den filen, det aktuelle programmet her er bare for testformål)

 

I en uthreaded utgave av programmet fryser (selvfølgelig) brukerinterfacet når filene blir lest og skrevet. Jeg har prøvd å legge ut funksjonen for å lese og skrive fil i en egen thread, men interfacet fryser fortsatt... :p Noen som kjenner noe til threadprogrammering i delphi 7 og kan hjelpe meg litt på vei? (Joda, ting kunne vært skrevet penere, men dette er et første forsøk på å gjøre en app multithreaded)

 

M.

 

Definisjonen av tråd-klassen:

TClientDataThread = class(TThread)
 private
Postsread: Integer;

 public
procedure synchAddDataToControl;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
procedure Terminate;
 end;

 

Metoder

constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
 inherited Create(CreateSuspended);
 FreeOnTerminate := true;
end;

procedure TClientDataThread.Terminate;
begin
 inherited;
end;

procedure TClientDataThread.Execute;
var
 Buf: array[1..4096] of Char;
 Charread,sleeptime: Integer;
 outfile: file; 
begin
 sleeptime:=strtoint(F660.Esleeptime.Text);
 // Tar en pause for å emulere instrumentet som kommer med en måling pr sekund
 Reset(DataFile,1); // Datafile, filen det leses fra, global variabel, ting settes opp et annet sted
 AssignFile(outfile,F660.LWriteFile.Caption); 
 Rewrite(outfile,1);
 BlockRead(DataFile, Buf,HEADSIZE,Charread); 
 {Filen inneholder først en header, deretter et antall datablokker }
 blockwrite(outfile,Buf,CharRead);
 postsread:=0;
 While not EOF(DataFile) do begin
sleep(sleeptime);
postsread:=inc(postsread);
BlockRead(DataFile, Buf,BLOCKSIZE,Charread);
blockwrite(outfile,Buf,Charread);
Synchronize(synchAddDataToControl);
 End;
 Closefile(outfile);
 F660.Statusbar.Panels[0].Text:=intToStr(postsread)+' poster - OK';
end;

procedure TClientDataThread.synchAddDataToControl;
begin
// F660 er navnet på applikasjonens main form
 F660.StatusBar.Panels[0].Text:=intToStr(postsread)+' poster lest';
 F660.StatusBar.Update;
end;

Endret av mysjkin
Lenke til kommentar
Videoannonse
Annonse

Jeg er ingen klepper i Delphi, men har litt erfaring.

 

I loopen din, med sleep, kan du sette inn en Application.ProcessMessages. Da kan du nok droppe "threadmodellen" din.

 

Processmessage håndterer alle beskjeder når du ber den om det. Dvs at du er tjent med å ha en loop-i-loop hvis sleep-tiden blir høy f.eks.

 

Dette er en typisk "Visual Basic" approach.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...