Seite 1 von 1

Consolen-Programme Lesen/schreiben teils inkompatibel

Verfasst: 15.01.2009 19:43
von benji
Hallo!!
Ich habe vor kurzem festgestellt, dass Read/Writeprogramstring bei manchen consolen Programmen scheinbar erst funktioniert, nachdem das Programm beendet wurde.
Die schreibfunktionen werden ausgeführt und haben auch Auswirkungen, allerdings scheint das Auslesen des Texts aus der Console erst nach dem Beenden der Anwendung zu funktionieren.
Dieses Problem taucht bei consolen Programmen auf, die NICHT in Purebasic geschrieben wurden.
Habe diverse Programme getestet immer mit dem Problem, dass die Textausgabe immer erst nach beenden des gestarteten Programms erfolgte.
Hier mein Thread - dort finden sie auch die Binary, bei der das beschriebene eintritt.

Viele Grüße, benji

Verfasst: 15.01.2009 19:51
von ts-soft
Betriebssystem?
PureBasic Version?
evt. Computerausstattung

Beispielcode?

Dem Link kann ich nur entnehmen, das Du das Eventhandling noch nicht
verstanden hast.

http://www.chiark.greenend.org.uk/~sgta ... gs-de.html

Verfasst: 15.01.2009 19:59
von benji
ts-soft hat geschrieben:Betriebssystem?
PureBasic Version?
evt. Computerausstattung

Beispielcode?

Dem Link kann ich nur entnehmen, das Du das Eventhandling noch nicht
verstanden hast.

http://www.chiark.greenend.org.uk/~sgta ... gs-de.html
OS: Win XP SP3
PB.: 4.30

der gag ist aber, dass der "Fehler" nur bei manchen anwendungen auftaucht
Code hier - ein und der selbe Code - unterschiedliche Anwendungen - unterschiedliches Ergebnis:

Code: Alles auswählen

UIN.s = "476077258" ; 476077258 465879999
pw.s = "123456"
  
*mem = AllocateMemory(2000)

hwnd = OpenWindow(0,0,0,400,300,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
       CreateGadgetList(hwnd)
       
List = ListIconGadget(#PB_Any,5,5,390,290,"Test",350)

      anz = 0
      zeile$ = ""
      listid = GadgetID(List)
   
;       prog = RunProgram("imcore/bin/base/accbuddy.exe" ,"" , "" , #PB_Program_Open | #PB_Program_Read |#PB_Program_Write ) ; Cpp (?)Console-Program -> erst am Ende der Runtime wird der Text ausgegeben
      prog = RunProgram("testconsole2.exe" ,"", "" , #PB_Program_Open | #PB_Program_Read | #PB_Program_Error |#PB_Program_Write) ;PB-Programm -> Text wird in echtzeit ausgegeben
;       prog = RunProgram("cmd.exe" ,"/k testconsole2.exe", "D:\Programmierung\Purebasic\source" , #PB_Program_Open | #PB_Program_Read ) ;"umweg" über die CMD -> erst am Ende der Runtime wird der Text ausgegeben
     
      If prog
       
;        CreateThread(@readtext(), prog)
        While ProgramRunning(prog)
         
            zeile$ = ReadProgramString(prog)
            AddGadgetItem(List, -1, zeile$)
           
            anz=SendMessage_(listid, #LVM_GETITEMCOUNT, 0, 0) - 1
            SendMessage_(listid, #LVM_ENSUREVISIBLE, anz, #True)
   
            While WindowEvent() : Wend
         
        Wend
               
     EndIf   
     
   CloseProgram(prog)
     

Repeat
 event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

End 
Falls es kein Fehler ist dann wüsste ich gern warum es nicht klappt xD

Verfasst: 15.01.2009 20:10
von freak
Das liegt daran das die andere Anwendung die Daten puffert. Da lässt sich nichts dran ändern.

Verfasst: 15.01.2009 20:13
von ts-soft
Der Code zur Testconsole2 wäre zwar auch nett, aber das Eventhandling,
wo Ereignisse verschluckt werden ist eine Krücke, da kann man nicht von
einem Bug sprechen.

Du solltest das Fenster disablen, verstecken oder ähnlich, während Du die
Ausgaben liest. Erst danach das Fenster aktualisieren.

Oder Du verwendest Threads und kommunizierst mit dem Eventloop per
Messages (für Anfänger nicht geeignet.)

Ist IMHO kein Bug.

// Nachtrag:
siehe freak :wink:

Verfasst: 15.01.2009 20:16
von benji
freak hat geschrieben:Das liegt daran das die andere Anwendung die Daten puffert. Da lässt sich nichts dran ändern.
ach schade.... darüber hatte ich auch was gelesen.
Naja danke - und sorry für den thread...