ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 05 Mai 2011, 13:48 
Offline
Schüler

Registriert: 25 Dez 2007, 01:28
Beiträge: 36
Wie oben beschrieben versuche ich ein Prozess zu starten:
"zbarcam --nodisplay --raw"
welches mittels einer Webcam ein QR Code einscannt und dann an Ruby weitergibt.
es klappt auch! der QR Code wird ausgegeben,
doch erst wenn ich das 2 mal das Bild vor der Webcam halte und der QR Code erkannt wird,
wird der Prozess beendet:


1
2
3
4
5

f = open("|zbarcam --nodisplay --raw")
foo = f.readline
puts foo
f.close


was mach ich falsch? geht es auch anders?
vielen Dank im voraus!


Nach oben
 Profil  
 
BeitragVerfasst: 05 Mai 2011, 14:09 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4872
Wohnort: RLP
Kann es sein, dass beim ersten Mal scannen kein newline ausgegeben wird, sondern erst beim scannen einer zweiten Zeile? Dann kehrt nämlich "readline" nicht zurück (liest bis _nach_ dem nächsten newline).


Nach oben
 Profil  
 
BeitragVerfasst: 05 Mai 2011, 15:08 
Offline
Schüler

Registriert: 25 Dez 2007, 01:28
Beiträge: 36
ja da ist irgendwo das Problem, nur verstehe ich das nicht so ganz wo.
zB:

1
2
3
4
5
6
7
8
9
f = IO.popen("zbarcam --nodisplay --raw")
puts "1"
foo = f.readline("\n")

puts foo
p foo

puts "2"
f.close

Diese Ausgabe sieht man sofort nach dem ersten Scann!
erst wenn ich das QRCode noch mal einscanne, wird das Programm beendet. verstehe das Verhalten nicht :-(


1
2
3
4
1
1272711409
"1272711409\n"
2


Nach oben
 Profil  
 
BeitragVerfasst: 05 Mai 2011, 18:33 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Mal kurz in die Anleitung geschaut:

Zitat:
--nodisplay
Disable output video window. Video input will be scanned until the
program is interrupted or otherwise signaled


Das Programm ist nicht für deine Art der Verarbeitung vorgesehen.
Es läuft ständig, bis es ein Steuersignal erhält. Das Signal
löst hier das close aus, aber es wird trotzdem noch
der nächste Barcode gescannt.

Hast du das Programm mal auf der Kommandozeile gestartet?
Da musst du es bestimmt mit STRG + C beenden, oder?

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 05 Mai 2011, 21:54 
Offline
Rubyist
Benutzeravatar

Registriert: 04 Jun 2008, 22:03
Beiträge: 394
ähm ich könnte mit genug zeit helfen, ka obs für dich zeit kritisch ist..
aber ich könnte aus der lib des programms eine ruby c-ext basteln ...
es gibt ja schon ein gem mit ffi aber das ist nicht alzuweit vortgeschritten


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 11:06 
Offline
Schüler

Registriert: 25 Dez 2007, 01:28
Beiträge: 36
@slowjack2k
--nodisplay
verhindert nur die visuelle Ausgabe, das Programm zbar läuft aber so wie du beschrieben hast.
Es scannt bis es geschlossen wird.
Ich habe aber nirgendwo gelesen, dass nach dem Schlissen noch der nächste Barcode eingescannt wird. Ist aber auch total unlogisch.
Es wäre ok, wenn ich an die Daten des zuletzt (nach dem Schlissen) eingescannten Barcodes kommen könnte, nur wie?
Hier:
When you close a popened pipe and that process is still running, your process will wait for it...
wird erklärt, dass nach dem Close noch auf den Prozess gewartet wird.
Daher habe ich einfach gekillt, nicht die feine englische Art. Vorschläge?
Das Ruby Script starte ich über die Console ;-), nicht zbar.
Es wird auch automatisch geschlossen (also nicht mittels strg+c)
hier ist der funktionierende Code:


1
2
3
4
5
6
7
8
f = open "|zbarcam --nodisplay --raw"
puts "Bitte zeigen Sie den QRCode:"
foo = f.readline

puts "Ihr QRCode lautet: "+foo.to_s

Process.kill 'TERM', f.pid
f.close


Hanmac ich glaub das ist doch viel Aufwand.
was ist aber ffi, ich kenne zbar gem.


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 11:21 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
"Video input will be scanned until the
program is interrupted or otherwise signaled"

sagt doch eindeutig, dass Programm läuft, bis es ein Signal bekommt.
Deine Lösung mit Sig-Kill zeigt auch das es so ist.

f.close löst ein Sig-Pipe aus, das nicht gleich verarbeitet wird. Bei Sig-Pipe
scheint das Programm aber noch einen scann abzuwarten, bis es sich beendet.


Wenn du auf der Konsole

> zbarcam --nodisplay --raw

aufrufst (nicht dein Ruby-Programm), dann beendet sich zbarcam direkt nach dem ersten scann? Ich denke schon,
das du mehrere Scanns dann machen könntest und das Programm mit STRG+C beenden musst.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 11:46 
Offline
Schüler

Registriert: 25 Dez 2007, 01:28
Beiträge: 36
slowjack2k hat geschrieben:
aufrufst (nicht dein Ruby-Programm), dann beendet sich zbarcam direkt nach dem ersten scann? Ich denke schon,
das du mehrere Scanns dann machen könntest und das Programm mit STRG+C beenden musst.


ja so stimmt es, ist dann der Kill genau der STRG+C Anweisung gleich zu setzten.
oder gibts es da noch was?


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 12:22 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Das ist Interrupt müsste dann INT sein. Für das Programm gibt es bestimmt auch den Source-Code. Die Endlos-Schleife zu finden dürfte kein Problem sein. Man könnte das Programm also umbauen, das es nur einen Code einliest.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 12:24 
Offline
Rubyist
Benutzeravatar

Registriert: 04 Jun 2008, 22:03
Beiträge: 394
oder wie gesagt setz ich mich an die lib und dann hast du keine probleme mehr mit dem Signalen


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 13:07 
Offline
Schüler

Registriert: 25 Dez 2007, 01:28
Beiträge: 36
slowjack2k was meinst du mit INT?
was zbar "Programm" wandelt Bildmaterial in eine Zeichenstring.
also "nur Code einlesen" verstehe ich nicht ganz.
Hier ist die zbar Bib:
http://zbar.sourceforge.net/
es gibt: programming interfaces (Python, Perl, C++)
ich hätte wahrscheinlich jetzt Python nehmen,
für Produktion werde ich sicherlich C++ bevorzugen.

Hanmac das wäre nicht nur was für mich sondern für die ganze Community!


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 13:27 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Zu Int:




Process.kill 'INT', f.pid


Ich meine, mann kann das Programm (zbarcam) so umschreiben,
dass es nur einen Barcode einliest und sich dann beendet
und nicht mehr in einer Endlosschleife läuft.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 06 Mai 2011, 15:10 
Offline
Schüler

Registriert: 25 Dez 2007, 01:28
Beiträge: 36
ok also "INT" ist dann das Pendant zu STRG+C, unterscheidet sich aber nicht sonderlich von TERM. KILL wäre da etwas rabiater.

Wie soll man da das Programm (zbarcam) umschreiben?
Ist doch eine Lib, geschrieben in C wenn ich es richtig verstanden habe.
Dann soll ich den Quellcode extrahieren, modifizieren und kompilieren.
ist doch zu viel Aufwand.
Wie gesagt das Ding läuft jetzt, für den produktiven Einsatz schreibe ich es noch mal in C++
da zbarcam eine API für C++ anbietet und mein Code dann weniger lesbar ist, weil kompiliert.
VG


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron