AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Consolenausgaben LIVE abfangen
Thema durchsuchen
Ansicht
Themen-Optionen

Consolenausgaben LIVE abfangen

Ein Thema von DelTurbo · begonnen am 20. Aug 2015 · letzter Beitrag vom 21. Aug 2015
Antwort Antwort
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.248 Beiträge
 
Delphi 2007 Architect
 
#1

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 16:02
@hathor,

Copy und Past gemacht. Rufe ich "cmd.exe /c dir c:\ " auf. Dann wird es im Memo angezeigt. Das ding ist ja sehr sehr schnell durch.

Rufe ich meine Consolenanwendung auf, dann sehe ich das erst nach 21 Sekunden wenn die zu ende ist. Ich hänge die mal hier dran. Ich gehe doch recht in der annahme das ich eigentlich jede zahl sofort sehen müsste, oder?

CaptureConsoleOutput('e:\Project1.exe', '', Memo1); @nahpets, leider finde ich nix unter TriggerPipe und Komponente. Es ist nicht so das ALLE was ich probiert habe nicht startet. Nur das mit dem TriggerPipe. Alles andere startet und zeigt dann dieses verhalten was ich beschreibe bzw. beschrieben habe.

@all, "cmd.exe /c dir c:\ " läuft immer. Rufe ich diverse andere Sachen auf, dann wie gesagt wartet ReadFile bis es fertig ist.

Mittlerweile Probiert unter Win7 64bit, Win732bit, WinXP.

Und nochmal danke für so viel Hilfe.
nahpets vielleicht kannst du mir die Komponente mal zukommen lassen wenn es Free ist.

EDIT: Ein dir d: /s kann ich nun wirklich sehen. Warum ich die anderen Programme nicht sehe verstehen ich grade nicht wirklich
Angehängte Dateien
Dateityp: zip Project1.zip (25,1 KB, 11x aufgerufen)
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!

Geändert von DelTurbo (20. Aug 2015 um 16:05 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 16:05
Die Komponente befindet sich in der Datei sbPipes.pas, die ich oben in die Zip-Datei gepackt habe.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.248 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 16:11
Das passiert wenn man versucht alles so schnell wie möglich zu testen um euch eine schnelle rückmeldung zu geben.

Nun passe ich besser auf.

Wie gesagt, eine irre lange dir /s Ausgabe sehe ich. Das normale "dir" war einfach zu kurz zum testen. Deswegen habe ich das kleine ConsolenProgramm gemacht.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 16:18
Also, habe mit meiner Project1.exe Deine Project1.exe aufgerufen und siehe da, es funktioniert

Aber: Die Ausgabemenge Deiner Exe ist so gering, dass sich die Ausgabe erst lohnt, wenn Dein Programm beendet ist und dann noch der Rest der Ausgabe gelesen wird.

Die ganzen Pipes geben nicht sofort jedes einzelne Zeichen aus, sondern "sammeln" immer ein bisserl.

Hier sind es
Delphi-Quellcode:
procedure CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
const CReadBuffer = 2400;
eben 2400 Byte. Immer wenn die voll sind, gibt es eine Ausgabe, beim Programmende dann den Rest.

Bei meiner Komponente sind es
Delphi-Quellcode:
const
  cPipeSize = 4096;
eben 4 Kilobyte.

Gib einfach mal für den Test was mehr aus oder schneller und dafür länger zählen...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.785 Beiträge
 
Delphi 12 Athens
 
#5

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 17:05
Keine Ahnung, ob es das tut was du willst, aber einen Versuch ist es vielleicht wert: DOSCommand
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 17:12
Vermutlich eher nicht, die lesen immer 1024 Byte, das "Problemprogramm" liefert aber nur (wenn ich das richtig mitbekommen habe) 74 Byte, diese aber in 10 3-Byte-Happen und 11 4-Byte-Happen über gefühlte 5 Minuten verteilt (nein, es sind 20 bis 21 Sekunden).

Geändert von nahpets (20. Aug 2015 um 17:33 Uhr) Grund: noch ein bisserl was ergänzt...
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.248 Beiträge
 
Delphi 2007 Architect
 
#7

AW: Consolenausgaben LIVE abfangen

  Alt 21. Aug 2015, 07:49
Keine Ahnung, ob es das tut was du willst, aber einen Versuch ist es vielleicht wert: DOSCommand
Leider bekomme ich das nicht so geändert das es auf meinem 2007 läuft. Schade.

Nochmal kurz zum Hintergrund. Ich starte eine Konsolen Anwendung die etwas berechnet. Die gibt alle (ich glaube 500ms) einen . (Punkt) aus. Ich dachte es kann ja nicht so schwer sein den Punkt in einem Label oder sonst wo anzuzeigen.
Deswegen gibt mein "DemoProgramm" auch so wenig und langsam etwas aus.

Leider habe ich mich da wohl geirrt. Ich danke allen die mir geholfen haben. Find ich echt super. Nun werde ich "gemütlich" und ohne Hektik mir mal das sbPipes ansehen.

Nochmal, danke an euch!!
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.248 Beiträge
 
Delphi 2007 Architect
 
#8

AW: Consolenausgaben LIVE abfangen

  Alt 21. Aug 2015, 08:27
@nahpets,
ich habe nun sbPipes unter Delphi 7 probiert. Wenn ich meine Demo oder aber das Berechnungsprogramm starte, passiert das selbe wie immer.

In der CaptureBar steht die ganze zeit Programm läuft noch... Es kommen keinerlei ausgaben. Ist das Programm zu ende dann wird sofort alles angezeigt.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#9

AW: Consolenausgaben LIVE abfangen

  Alt 21. Aug 2015, 08:29
Hallo..

Es liegt tatsächlich an der Console mit Pipes.
Wenn deine Konsolenanwendung ein WriteLN macht, dann wird dieses erstmal von StdOut gepuffert und dann komplett an die Pipe geFlusht..

Würde in deiner Konsolenanwendung nach jedem
WriteLN('.');
ein
Flush(Output);
gemacht werden, dann wird die Ausgabe direkt in die Pipe geschrieben und könnte einzeln mit ReadFile gelesen werden.

Habe hier mal dein Testprogramm nachgebaut, mal 0-20 ohne Flush, mal 0-20 mit Flush..
Und siehe da, die ersten 20 kamen erst zusammen, die weiteren 20 schön einzeln.

http://www.delphibasics.co.uk/RTL.asp?Name=Flush

Hier wirds (mit einem File) beschrieben, aber eine Pipe ist für MS ja auch nur ein File.

Geändert von HolgerX (21. Aug 2015 um 08:32 Uhr)
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.248 Beiträge
 
Delphi 2007 Architect
 
#10

AW: Consolenausgaben LIVE abfangen

  Alt 21. Aug 2015, 08:44
Hi,
danke für die Antwort. Leider ist das Berechnungs Programm nicht von mir und es sind keine Quellen vorhanden. In meine Demo könnte ich das einbauen.

Letzte vielleicht sogar dumme frage: Es ist wohl nicht möglich dem Programm ein Flush "unterzujubeln"? Das ich während dem warten alle 300ms ein Flush dahin schicke?

Wenn nicht, naja heute Nacht habe ich mich schon eigentlich damit abgefunden das es nicht geht. Ich werde eine Sanduhr anzeigen
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  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 20:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz