mysjkin Skrevet 24. november 2009 Del Skrevet 24. november 2009 (endret) 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... 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 24. november 2009 av mysjkin Lenke til kommentar
Largie Skrevet 24. november 2009 Del Skrevet 24. november 2009 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
mysjkin Skrevet 26. november 2009 Forfatter Del Skrevet 26. november 2009 Takk for den, skal se på det. M. Lenke til kommentar
mysjkin Skrevet 3. desember 2009 Forfatter Del Skrevet 3. desember 2009 Takk! Det gjorde susen M. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå