beatzler
Goto Top

.bat Aufruf mittels angeschlossenen Taster soll nur genau 1x erfolgen

Hey,

ich hab da mal ne kurze Frage.

Habe einen ext. Taster an einem PC angeschlossen. Sobald dieser getastet ist wird eine Batch Datei aufgerufen. Soweit so gut klappt das auch alles.

Die Batch Datei sollte aber nur genau einmal aufgerufen werden. Tastet der Taster nun kommt es vor das die Batch 2-5 mal etc. ( je nachdem wie lange getastet wird ) aufgerufen wird.

Ich habe jetzt versucht das in der Batch selbst so zu lösen:

@echo OFF
@rem Unterdrückung mehrerer Aufrufe
IF EXIST c:\Tischtaster\1.txt ( GOTO EXIT) else ( GOTO LOS )

:LOS
ECHO TASTER 1 AKTIV! >> c:\Tischtaster\1.txt

Eigentlicher Inhalt der Batch...

@rem Kurze Pause zum Verhindern mehrfacher Aufrufe
C:\WAIT.EXE\WAIT.EXE -t 6000

:EXIT
DEL c:\Tischtaster\1.txt
EXIT

Das hat schon eine deutliche Verbesserung hervorgerufen jedoch wird jezt immer noch mind. 2 manchmal 3 x die Batch aufgerufen, zu oft face-sad

Kennt ihr noch einen anderen, bessern, / schnelleren Trick?

Hab schon überlegt den Prozess abschiessen zu lassen aber das geht ja auch nicht ...

Vielen Dank für einen Tipp !

MFG Beatzler

Content-Key: 179310

Url: https://administrator.de/contentid/179310

Printed on: April 18, 2024 at 11:04 o'clock

Mitglied: 68162
68162 Jan 21, 2012 at 15:43:55 (UTC)
Goto Top
Der Taster prellt (mit großer Wahrscheinlichkeit).
HAUPTFRAGE: Was ist "hardwaremässig" zwischen dem Taster und der aufgerufenen Batch-Datei?

Sinnvollerweise sollte entweder der Taster entprellt werden, z.B. mit einem RS-Flip-Flop.
Oder Du löst das über Software, dass z.B. der erste Tastendruck einen Interrupt auslöst und dann weitere "Nachpreller" ignoriert werden. Batch-Prog. dürfte aber dafür zu langsam sein ...

MfG, FM_81
Member: Beatzler
Beatzler Jan 21, 2012 at 16:41:25 (UTC)
Goto Top
Hey,

danke für die Antwort.

Ja das mit der entprellung würde Sinn machen... Hardwaremäßig kann aufgrund der Bauform aber nichts mehr geändert werden.

Welche Softwaremöglichkeiten gibt es ? Der Taster simuliert mittels USB Anschluss einen Tastendruck der ganz normalen PC Tastatur.

VBSkript?
Member: icsat
icsat Jan 21, 2012 at 17:00:35 (UTC)
Goto Top
Hallo Beatzler,

ich würde wie -FM-81- auch die Ursache in der Hardwareverbindung vor dem Batch sehen. Da ich mich da Hardwaretechnisch gar nich auskenne, kann ich Dir dort auch nicht helfen. Allerdings hätte ich eine Idee, was im Batch etvtl. funktionieren könnte. Versuch doch am Anfang des Batches mal ein Warten mit zufälliger Verzögerung vor der Prüfung, ob der Taster schon gedückt wurde:
C:\WAIT.EXE\WAIT.EXE -t %random% %%100


Gruß icsAT
Member: Beatzler
Beatzler Jan 21, 2012 at 17:12:32 (UTC)
Goto Top
Hey,

auch solche Ideen hab ich gehofft, sehr cooler Ansatz face-wink Jedoch klappt das leider auch noch nicht so ganz... Es werden dann auch wieder mind. 2 Batches komischerweise mit genau der gleichen Wartezeit ( kann ich im CMD Fenster ja sehen welche random Zeit er für diesen Aufruf genommen hat ) gestartet und enden somit ja auch wieder gleichzeitig ..

Kann man das ganze noch irgendwie verfeinern oder die "Random-Wahrscheinlichkeit" erhöhen ? Das ganze sollte aber auch nicht zulange dauern sonst denkt man ja wenn man gedrückt hat das nix passiert ....

Aber die Idee is super face-smile

MFG Beatzler
Mitglied: 68162
68162 Jan 21, 2012 at 19:28:34 (UTC)
Goto Top
Zitat von @Beatzler:
Es werden dann auch
wieder mind. 2 Batches komischerweise mit genau der gleichen Wartezeit ( kann ich im CMD Fenster ja sehen welche random Zeit er
für diesen Aufruf genommen hat ) gestartet und enden somit ja auch wieder gleichzeitig ..

Weil der Taster eben in dem Falle zwei Signale kurz hintereinander gesendet hat. Und per Batch darauf zu reagieren ist eben einfach zu langsam; wenn das Ding per USB angeschlossen ist, muss das Schaltsignal ja quasi noch "durch die Verarbeitungsschichten des Betriebssystemes". Hast Du dort die Möglichkeit, Einfluss zu nehmen? (Weil das Ding evtl. eine Tastatur simuliert.)

Eine Idee hätte ich vllt. noch: zu Beginn der Batch kurz warten (Random um ca. 100ms?), dann irgendwie schauen, ob weitere Instanzen der selben Batch laufen, die restlichen alle killen, dann erst weiter machen.

Wenn nicht bleibt m.E. nur der schon genannte Hardwareansatz?

MfG, FM_81
Member: pieh-ejdsch
pieh-ejdsch Jan 21, 2012 at 23:51:22 (UTC)
Goto Top
moin,

wenn ein Handle geöffnet ist kann ein anderes dieses nicht benutzen.
oder wer zuerst kommt malt zuerst
mit der Umleitung >> braucht ein Nachzögling sogar noch länger
@echo off & setlocal
set /p raus=<testdatei 2>nul
if defined raus goto :eof
(for /l %%i in (1,1,100000) do @echo %%i )>testdatei || goto :eof
:: weiter gehts
:: und noch weiter

:: Abschluss
:Loeschversuch
del testdatei 2>nul ||goto :Loeschversuch

Gruß Phil
Member: Beatzler
Beatzler Jan 22, 2012 at 14:46:01 (UTC)
Goto Top
Hey,

das ja super genial face-smile klappt wunderbar !!!

Vielen lieben dank!!!

Könntest du mir Zeile 4 nochmal genauer erläutern?

Warum (1,1,100000) =?

Vielen Dank! läuft perfekt
Member: pieh-ejdsch
pieh-ejdsch Jan 22, 2012 at 16:44:38 (UTC)
Goto Top
moin Beatzler,

Warum (1,1,100000) =?
Es kann auch schon 10000 ausreichend sein. Wichtig ist nur eine Genügend große Zeitspanne die Testdatei mit einem Handle (Lesgeschützt) zu öffnen.
Es wird jede Zeile eine Ziffer bis N in die Datei eingetragen.

Solange wird jeder weitere Batch (eigentlich schon in Zeile 3 rauzsgeworfen) bis der erste Batch die Datei wieder gelöscht hat.
Zeile 4 ist nur zur Sicherheit, falls der zweite Batch zu schnell (nur ein Zeile) hinterherhinkt, dann schlägt das öffnen der Datei zum reinschreiben Fehl (der erste Batch schreib ja schon hinein) und bei Fehler wird das Goto :eof ausgeführt.

Goto :löschversuch ist eigentlich nutzlos, da die Zeile 3 für Folgende schon lange gegriffen hat.

Gruß Phil
Member: pieh-ejdsch
pieh-ejdsch Jan 22, 2012 at 22:40:58 (UTC)
Goto Top
Falls der Batch sowieso länger benötigt würde der Aufruf der Batch so genügen. Laut Beitrag Titel gefragt.
Da Handle 4 benutzt wird, können trotzdem die Anderen und Fehlermeldungen gelesen oder geloggt werden.
MyBatch.cmd 4>"%temp%\OneBatchOnce"
Eine weitere Ausführung schlägt fehl während der erste Batch noch läuft.

Für Abbruch im Batch sind weitere möglichkeiten:
1. den Batch zuerst und danach eine Zeit sperren
@echo off & setlocal

 :: ein weiterer Batch führt zum Abbruch wärend der 1. Batch in der Klammer ist (OriginalBatch läuft zuerst durch und danch 10 sec Ping)
(
call :OriginalBatch
echo in Zehn sekunden darf der naechste Batch erst.
ping localhost -n 10 >nul
) 4>"%temp%\BatchTimer10secMin" || goto :eof  

echo ab hier kann ein weiterer Batch von vorn los rennen!
goto :eof

:OriginalBatch
Echo Meine Batch Beginnt SOFORT mit der Ausfuerung.
echo Batch ist fertig

2. zuerst eine Zeitspanne abwarten dann den Batch starten
@echo off & setlocal

:: Variante 1

 :: Für den Abbruch bis zum löschen der TestDatei ( !! TestDatei muss nachher mindestens erstellt werden, 1. Batch läuft nachher Weiter)
if exist "%temp%\Testdatei" goto :eof  


:: Variante 2

 :: Für den Abbruch bis die Schleife Fertig ist (1. Batch läuft nachher weiter)
(for /l %%i in (1,1,100000) do @echo %%i) >"%temp%\Testdatei" 2>nul || goto :eof  

echo ab hier kann ohne Variante 1 ein weiterer Batch von vorn los rennen!


:: Variante 3

 :: Alternative als Timer (ping) (Batch läuft nachher weiter)
(echo xxx &ping localhost -n 10 >nul) >"%temp%\Testdatei" 2>nul || goto :eof  

echo ab hier kann ohne Variante 1 ein weiterer Batch von vorn los rennen!


:: Mein Batch
Echo Meine Batch beginnt erst SPAETER mit der Ausfuerung

:Loeschversuch
if exist "%temp%\Testdatei" del "%temp%\Testdatei" 2>nul ||goto :Loeschversuch & :: ohne Variante 1  
echo Batch ist Fertig
goto :eof
Analog dazu bei 1. Batch: die Zeilen 5 und 6 tauschen:

Und immer daran denken! Geht der eigentliche NutzBatch in die Binsen
Echo ON
einsetzen. Und in einem CMD Fenster ausführen.

Gruß Phil
Member: Beatzler
Beatzler Jan 24, 2012 at 17:43:35 (UTC)
Goto Top
HEy,

suuuuper! Vielen Dank face-smile

Ich bin mit deiner ersten Variante ( 1. Antwort / Lösung ) sehr gut zum Ziel gekommen mittlerweile :face-wink

THX!

MFG Beatzler