Avatar billede mr_green Nybegynder
13. maj 2003 - 12:48 Der 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.

....Christian
Avatar billede razersedge Nybegynder
13. maj 2003 - 14:24 #1
Du kan evt bruge en TList.

Brug Add funktionen til at tilføje objekter, de bliver tilføjet til enden.

Slet så den første når den er blevet processeret.

... FIFO
Avatar billede razersedge Nybegynder
13. maj 2003 - 14:24 #2
Skal du have et stykke kode?
Avatar billede mr_green Nybegynder
13. maj 2003 - 14:45 #3
Ja det ville da være rart :-)
Avatar billede razersedge Nybegynder
13. maj 2003 - 14:50 #4
Ok, jeg ordner lige noget..
Avatar billede razersedge Nybegynder
13. maj 2003 - 14:59 #5
Du får lige hele uniten:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

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;

end.

-------

Hvis du har spørgsmål så spørg løs
Avatar billede razersedge Nybegynder
13. maj 2003 - 15:01 #6
Jeg har brugt en timer med et interval på 1000 millisekunder til at printe dataen fra listen.
Avatar billede mr_green Nybegynder
13. maj 2003 - 15:16 #7
Jeg vender lige tilbage imorgen, er på vej ud af døren nu, men det ser meget lovende ud. Takker for hjælpen indtil videre

....Christian
Avatar billede razersedge Nybegynder
13. maj 2003 - 15:17 #8
Det var så lidt.
Avatar billede mr_green Nybegynder
14. maj 2003 - 09:13 #9
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?
Avatar billede razersedge Nybegynder
15. maj 2003 - 14:04 #10
bruger du koden det sted hvor du skal have stregkoden registreret?
Avatar billede razersedge Nybegynder
15. maj 2003 - 14:05 #11
altså:

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?
Avatar billede mr_green Nybegynder
15. maj 2003 - 14:05 #12
ja jeg bruger koden i det stykke der modtager stregkoden..
Avatar billede razersedge Nybegynder
15. maj 2003 - 14:12 #13
gemmer du stregkoden som en streng eller hvordan?

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.
Avatar billede mr_green Nybegynder
15. maj 2003 - 14:16 #14
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...
Avatar billede razersedge Nybegynder
15. maj 2003 - 14:27 #15
Lukker du forbindelsen til databasen? Hvad er din timers interval på (nok ikke det)?

Scanner 2? Dvs når du laver udtræk fra db, eller når du scanner med stregkodelæseren?
Avatar billede mr_green Nybegynder
15. maj 2003 - 14:31 #16
Den procedure der modtager stregkoderne smider osse data i TList og kalder så den procedure der laver SQL udtræk.

Jeg lukker forbindelsen til databasen, laver et nyt udtræk med plads 0 i Tlist og åbner så databasen igen.

Timer intervallet står lige nu på 1000 men jeg har prøvet med andet...
Avatar billede razersedge Nybegynder
15. maj 2003 - 14:35 #17
Du lukker databasen?

Sender en ny Query til databasen med plads 0 i Tlist?

.. og åbner så databasen igen?

Du har måske skrevet forkert, men, du sender en query til dben mens forbindelsen er lukket?
Avatar billede mr_green Nybegynder
15. maj 2003 - 14:38 #18
Det jeg mener er at jeg laver et SQL.add og når jeg så har lavet min streng laver jeg en Query.open :-)
Avatar billede razersedge Nybegynder
15. maj 2003 - 22:29 #19
hmmm...

Kender ikke så meget til SQL komponenter i Delphi.

kører det fint hvis du kun tager en af gangen? Eller hvornår er det præcist at den fryser? når den anden stregkode bliver kørt igennem?
Avatar billede razersedge Nybegynder
16. maj 2003 - 18:30 #20
Er du her stadig?
Avatar billede mr_green Nybegynder
19. maj 2003 - 08:30 #21
Nu er jeg vendt tilbage, programmet fryser hvis jeg scanner 2 hurtigt efter hinanden...
Avatar billede razersedge Nybegynder
19. maj 2003 - 14:49 #22
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.
Avatar billede mr_green Nybegynder
19. maj 2003 - 14:56 #23
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 :-)
Avatar billede razersedge Nybegynder
19. maj 2003 - 15:10 #24
Takker for point, skal nok hjælpe hvis jeg kan.

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.
Avatar billede mr_green Nybegynder
19. maj 2003 - 15:22 #25
Netop, jeg har osse siddet og prøvet mig lidt frem, men kan ikke rigtigt få det til at køre ordentligt.... har du styr på tråde?
Avatar billede razersedge Nybegynder
19. maj 2003 - 15:58 #26
Hm.. hehe, har prøvet det før, kan være jeg lige kan bikse et eksempel sammen.
Avatar billede razersedge Nybegynder
19. maj 2003 - 16:18 #27
Jeg har udbygget den gamle unit med en tråd, som kaldes ved hvert gennemløb af buffer.

Vælg "New" og tilføj en tråd til dit projekt, så har du en tråd klar, her er de to units jeg har benyttet, unit2 er tråden:


unit1:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

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;


end.

------------------------------
unit2:


unit Unit2;

interface

uses
  Classes,SysUtils;

type
  Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

uses Unit1;

{ 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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester