Barcodescanner libzbar-0.dll in Lazarus einbinden?

Antworten
MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Barcodescanner libzbar-0.dll in Lazarus einbinden?

Beitrag von MmVisual »

Hallo,

Ich will gerne einen Barcode per USB Webcam einscannen und in Lazarus verwenden. Dazu habe ich ZBar gefunden und die DLL eingebunden. Der Scan-Bildschirm geht auf und man das scannen geht auch. Die Infos gelangen in meine EXE. Doch sobald das Scan Fenster mit der q Taste schließe (Q, auf Tastatur) stürzt die EXE ab.

Weiß jemand was ich ändern könnte damit das nicht passiert? Es liegt wohl irgendwie daran dass die DLL nicht sauber beendet und zieht meine EXE gleich mit in den Abgrund.
Anbei der Quelltext incl DLL und EXE zum Test. Ein Screenshot wie das aus sieht.
Bild1.jpg

TestZBar_14B29.zip
(1.59 MiB) 108-mal heruntergeladen


Ich musste die DLL ein einem eigenen Thread ausführen, denn wenn ich das nicht mache friert die EXE sofort ein sobald der Callback mit den Barcode-Infos aufgerufen wird. Mit dem Thread kann ich per Synchronize die Infos an den EXE Thread weiter reichen und im Memo anzeigen.

PS: Als Inspiration der Umsetzung habe ich die Datei "zbarcam.c" umgeschrieben, die gibt es hier: http://sourceforge.net/p/zbar/code/ci/d ... e/zbarcam/

Vielen Dank schon mal, Grüße
Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Barcodescanner libzbar-0.dll in Lazarus einbinden?

Beitrag von Michl »

Da sich keiner meldet, habe ich mir Dein Programm auf meinem Notebook mit Webcam (hätte gar nicht gedacht, dass das so problemlos funktioniert) mal für 20 Minuten angesehen.
Ich muss jetzt leider auch weg, doch wollte ich Dir vorher noch mein bisherigen Stand mitteilen, vielleicht hilfts ja als Anregung.

Bevor Du aufräumst, muss Du ZBarProc beenden (wahrscheinlich gibt es eine Art ProcessMessages, ich warte einfach nochmal 100ms auf ein Userinput, um die Beendigung von ZBarProc durchführen zu lassen). So kommt es bei mir zu keinem SIGSEGV mehr:

Code: Alles auswählen

procedure TThreadZBar.Execute;
...
  until (iRC < 0) Or Terminated;
 
  zbar_processor_set_active(ZBarProc, 0);   // <- Beenden
  zbar_processor_user_wait(ZBarProc, 100)// <- Ersatz für .ProcessMessages (gibt es aber bestimmt ein besseren Ersatz dafür)
 
  zbar_processor_set_data_handler(ZBarProc, Nil, Nil);
//  if Not((iRC <> Ord('q')) And (iRC <> Ord('Q')) And
//    (zbar_processor_get_error_code(ZBarProc) <> ZBAR_ERR_CLOSED)) Then
    zbar_processor_destroy(ZBarProc);
  ZBarProc := Nil;
  Synchronize(@Termi);
end

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten