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;