AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

QR-Code scannen

Ein Thema von DaCoda · begonnen am 27. Dez 2024 · letzter Beitrag vom 28. Dez 2024
 
Rollo62

Registriert seit: 15. Mär 2007
4.167 Beiträge
 
Delphi 12 Athens
 
#7

AW: QR-Code scannen

  Alt 28. Dez 2024, 18:01
Hilft vielleicht nicht direkt für deine letzte Frage, aber ich würde den Guard etwas früher vorziehen,
so dass es nicht erst in den Thread laufen muss, um dann da rauszufliegen.

Siehe Kommentare
Delphi-Quellcode:

procedure TfrmMain.CameraSampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin

  // Direkt hier abblocken, sollte alle Frames ignorieren, bis der Image-Process abgeschlossen wurde
  if (fScanInProgress) then
  begin
      exit;
  end;


  TThread.Synchronize(TThread.CurrentThread,
  procedure
  begin
    Camera.SampleBufferToBitmap(imgCamera.Bitmap, True);

// if (fScanInProgress) then
// begin
// exit;
// end;

    { This code will take every 4 frame. }
    inc(fFrameTake);
    if (fFrameTake mod 4 <> 0) then
    begin
      exit;
    end;

    if Assigned(fScanBitmap) then
      FreeAndNil(fScanBitmap);

    fScanBitmap := TBitmap.Create();
    fScanBitmap.Assign(imgCamera.Bitmap);

    ParseImage();
  end);
end;

...

procedure TfrmMain.ParseImage();
begin

  TThread.CreateAnonymousThread(
    procedure
    var
      ReadResult: TReadResult;
      ScanManager: TScanManager;

    begin
//Das wird hier dann nicht mehr benötigt
// fScanInProgress := True;
      ScanManager := TScanManager.Create(TBarcodeFormat.Auto, nil);

      try

        try
          ReadResult := ScanManager.Scan(fScanBitmap);
        except
          on E: Exception do
          begin
            TThread.Synchronize(TThread.CurrentThread,
              procedure
              begin
                lblScanStatus.Text := E.Message;
              end);
            exit;
          end;
        end;

        TThread.Synchronize(TThread.CurrentThread,
          procedure
          begin

            if (Length(lblScanStatus.Text) > 10) then
            begin
              lblScanStatus.Text := '*';
            end;

            lblScanStatus.Text := lblScanStatus.Text + '*';
            if (ReadResult <> nil) then
            begin
              Memo1.Lines.Insert(0, ReadResult.Text);
            end;

          end);

      finally
        if ReadResult <> nil then
          FreeAndNil(ReadResult);

        ScanManager.Free;

        //Das sollte OK sein, und den ganzen Scan-Prozess wieder freigeben, ab dem nächsten Frame
        //aber sicherheitshalber auch in einem Queue
        TThread.Queue(TThread.CurrentThread,
          procedure
          begin
              fScanInProgress := false;
          end);



      end;

    end).Start();

end;

Geändert von Rollo62 (28. Dez 2024 um 18:03 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz