AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Das b(l)ockige ReadLn einer Konsolenanwendung - Workaround?
Thema durchsuchen
Ansicht
Themen-Optionen

Das b(l)ockige ReadLn einer Konsolenanwendung - Workaround?

Ein Thema von moelski · begonnen am 31. Mär 2010 · letzter Beitrag vom 1. Apr 2010
Antwort Antwort
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Das b(l)ockige ReadLn einer Konsolenanwendung - Workaround?

  Alt 31. Mär 2010, 13:58
Moin !

Zum Testen nutze ich dann und wann gerne Konsolenanwendungen. Die sind schnell geschrieben und bei einigen Dingen ganz praktisch.

Jüngst habe ich mir eine Konsolenanwendung geschrieben mit einem TIdTCPClient. Im Grund soll die Anwendung Kommandos an den Server senden und das Feedback des Servers ausgeben.

Das Auslesen des Server Feedbacks geschieht in einem eigenen Thread und funktioniert auch ganz gut. In der Anwendung gibt es dann diese Stelle hier:
Delphi-Quellcode:
    while Input <> 'qdo begin
      Write('--> ');
      Readln(Input);
      Client.IOHandler.WriteLn(Input);
    end;
Ich lese was ein und schreibe es weg zum Server. Auch das funktioniert. ABER ... Das Readln blockt die Ausgabe in die Console. Selbst wenn der Thread Daten zum Auslesen bekommt, so werden diese nicht dargestellt. Letztlich macht der Thread ein WriteLn(Msg);.

Gibt es einen Weg um dieses ReadLn Dilemma zu umgehen?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 31. Mär 2010, 14:09
Ich vermute stark, daß Du bei einer Console Pech hast. Solange kein CR eingelesen wurde, gehört die Console exklusiv dem Readln.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 31. Mär 2010, 14:11
Moin !

Ja sowas hab ich schon vermutet.
Mist ...

Ob man das mit Read anstatt Readln in den Griff bekommen könnte?
Und das CR selber überwachen ?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#4

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 31. Mär 2010, 14:34
Read, wartet auch auf die Eingabe.

Du kannst also "nur" den Tastaturstatus abfragen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#5

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 1. Apr 2010, 11:41
muss es denn überhaupt ReadLn() sein? Du kannst doch auch mit ein paar Leerzeilen (WriteLn()) und ein paar Sleeps das ganze auch ohne machen, oder willst du explizit darauf warten, dass der User/du selbst was eingibt?

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 1. Apr 2010, 11:47
Moin Bernhard,

ich habe es jetzt hinbekommen.

Kann gleich auch mal meinen Code posten - der ist aber aufgrund der Tests noch sehr konfus

Anyway ..
Ich werte jetzt in einem Thread den InputBuffer und lese den ggf. mit ReadBytes. Das verhindert schon mal eine Blockade beim Lesen vom socket.

In der Consolenanwendung selber nurtze ich Read um Zeichen zu lesen und werte das CR & LF aus. Das Read blockt kann ich nicht bestätigen. Wenn ich nämlich im Thread zyklisch einfach was auf die Console schreibe, dann wird es angezeigt obwohl ich ein Read aktiv habe was auf ein Zeichen wartet.

Bei enter wird das Commando dann dem TIdTCPClient gegeben zum Verschicken - "gesichert" über einen TMutex.

Das klappt bis jetzt wunderbar. Ich kann eingaben machen und parallel dazu bekomme ich direkt Feedback auf der Console.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#7

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 1. Apr 2010, 12:04
Nur aus Neugier: Für eine Testanwendung wäre ein VCL-Projekt wirklich nicht einfacher gewesen? Klar, hast du jetzt wieder was neues gelernt, aber...effizient ist das nicht unbedingt, oder?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Das b(l)ockige ReadLn einer Konsolenanwendung - Workarou

  Alt 1. Apr 2010, 13:05
Moin !

Zitat:
Für eine Testanwendung wäre ein VCL-Projekt wirklich nicht einfacher gewesen
Na klar. Das habe ich zwischenzeitlich auch fertig gestellt

Ich ich mag nunmal Consolenanwendungen
Und es hat mich gereizt das hinzubekommen.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz