13. maj 2003 - 12:48Der er
26 kommentarer og 1 løsning
buffer problem...
Jeg er ved at lave et program der læser stregkoder, mit problem er så at hvis jeg læser 2 stregkoder lige efter hinanden fryser mit program..... så jeg skal på en eller anden måde have oprettet en FIFO (First in first out) buffer, jeg ved bare ikke hvordan dette kan lade sig gøre, eller måske er der nogen der har en anden idé??
Bruger komponenten AsyncFree til at læse stregkoderne med.
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; TData = record Data : String; end;
PData = ^TData;
var Form1: TForm1; DataList : TList;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin DataList := Tlist.Create; //Create Listen end;
procedure TForm1.Button1Click(Sender: TObject); var Data : PData; begin New(Data); //Opret ny pointer til en TData record Data^.Data := TImeToStr(now); //Din stregkode, jeg bruger klokken DataList.Add(Data); //Tilføj til stakken end;
procedure TForm1.Timer1Timer(Sender: TObject); var Data : PData; begin If (DataList.Count > 0) then begin Data := DataList.Items[0]; //Tilgå den første Memo1.Lines.Add(Data^.Data); //print første DataList.Delete(0); //Slet første Dispose(Data); //Slet data som pointer peger på end; end;
Det virker fint, der er bare et problem.... den skal registrere alle de stregkoder der bliver scannet i TList, men når timeren er gået igang registrere den ikke stregkoder...? kan man evt. give dem 2 forskellige tråde eller er der en anden måde?
var Data : PData; begin New(Data); //Opret ny pointer til en TData record Data^.Data := TImeToStr(now); //Din stregkode, jeg bruger klokken DataList.Add(Data); //Tilføj til stakken
dette opretter jo en ny, og tilføjer denne til stakken.
kan du evt vise lidt kode fra det sted hvor det skal gemmes?
Jeg tror ikke jeg er helt med på hvad du mener er problemet, altså, når timeren kører kan der ikke tilføjes nye records til listen? Det burde der nu nok kunne.
1. Jeg modtager 5 karakterer fra stregkodelæseren i en streng. 2. de smides over i TList 3. jeg hiver dem ud af TList og laver SQL udtræk med dem som variabler.
Men programmet fryser med det samme jeg scanner 2 for hurtigt efter hinanden...
Er du sikker på det er når du laver de sql kald at det fryser? Kan det ikke være før de bliver smidt i den buffer? Bufferen burde jo virke fint nok. Prøv at sætte intervallet til 5 sekunder eller højere, bare for at teste.
Jeg har fundet en midlertidig løsning på problemmet med at tilføje en commit knap, så når alle stregkoderne er blevet scannet hiver den dem ud af listen en efter en, det virker fint... Den kan bare ikke hive dem ud samtidig med der kommer nye ind.....?
Du får pointene her, men du må self stadig gerne hjælpe hvis du har tid :-)
Du har egentligt nok ret i at det du siger med at den ikke kan hente data fra databasen samtidigt med at du scanner. Kan forestille mig at hvis du samtdigt skanner, mens du modtager svar fra databasen, kan få et problem, dog kun et gæt, har aldrig selv leget med databaser i delphi før.
Det kunne måske løses ved at bruge tråde, ved hvert udtræk fra bufferen, så starte en tråd hvis opgave det så er at tage kontakt med databasen, når den har fået svar, og gjort hvad den skal, så lukke sig selv.
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; TData = record Data : String; end;
PData = ^TData;
var Form1: TForm1; DataList : TList;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin DataList := Tlist.Create; //Create Listen end;
procedure TForm1.Button1Click(Sender: TObject); var Data : PData; begin New(Data); //Opret ny pointer til en TData record Data^.Data := TImeToStr(now); //Din stregkode, jeg bruger klokken DataList.Add(Data); //Tilføj til stakken end;
procedure TForm1.Timer1Timer(Sender: TObject); var Data : PData; begin If (DataList.Count > 0) then begin //Data := DataList.Items[0]; //Tilgå den første //Memo1.Lines.Add(Data^.Data); //print første Unit2.Thread.Create(false);
//DataList.Delete(0); //Slet første //Dispose(Data); //Slet data som pointer peger på end; end;
{ Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Thread.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }
{ Thread }
procedure Thread.Execute; var Data : PData; begin { Place thread code here } Data := DataList.Items[0]; DataList.Delete(0); Form1.Memo1.Lines.Add(Data^.Data); Dispose(Data); end;
end.
------------------
Dette virker, men jeg ved ikke nok om tråde til at vide om der kan skabes nogle komplikationer eller fejl ved ovenstående, prøv det.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.