Read/Write inkompatibel zu manchen consolen bzw verzögert?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

hier mal eine kleine Demo

zuerst das Consolenprogramm, als Exe compilieren

Code: Alles auswählen

 If OpenConsole()
  
    For j = 1 To 500
    
      PrintN(Str(j) + " dies ist ein Test.")
      Delay(20)
    
    Next
    
 EndIf

und nun die Demo zum einlesen

Code: Alles auswählen

Procedure ReadProgData(file$,listpbnr) 

      anz = 0
      zeile$ = ""
      listid = GadgetID(listpbnr)
    
      nr = RunProgram(file$, "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)
      
      If nr  
        
        While ProgramRunning(nr) 
          
            zeile$ = ReadProgramString(nr) 
            AddGadgetItem(listpbnr, -1, zeile$)
            
            anz=SendMessage_(listid, #LVM_GETITEMCOUNT, 0, 0) - 1 
            SendMessage_(listid, #LVM_ENSUREVISIBLE, anz, #True) 
    
            While WindowEvent() : Wend 
          
        Wend 
        
     EndIf   
    
     CloseProgram(nr)

ProcedureReturn anz

EndProcedure


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) 

Debug ReadProgData("testconsole.exe", list)

Repeat
 event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

End 
 
Das entscheidende ist While WindowEvent() : Wend
Bei Bedarf kann auch noch ein Delay(x) dazwischen gesetzt werden
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

okay werd das mal testen :)
sieht schonmal sehr vielversprechend aus :)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

*hust*

... damit freezed das fenster zwar nicht, aber eingaben verarbeiten tut es auch nicht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Kaeru Gaman hat geschrieben:*hust*

... damit freezed das fenster zwar nicht, aber eingaben verarbeiten tut es auch nicht.
oh tatsächlich?
ich werd natürlich beide codes testen.. aber wenn du mir schon sagen kannst, dass der von hjbremer nicht so klappt wie ich wollte dann werd ich mich schonmal nicht wundern wenns tatsächlich so ist ;D

Danke aber trotzdem soweit für euch alle :allright:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, die Procedure die die Daten vom externen programm holt frisst alle events ohne drauf zu reagieren, nur damit die liste life angezeigt wird.
das ist das was While WindowEvent():Wend macht.

... und das war auch das, worüber Kiffi und ich gesprochen haben:
wenn du dein WaitWindowEvent() mit einem timeout versiehst,
und dein Auslesen und Zeile dazusetzen nur durchführst, wenn kein Event anliegt,
dann erreichst du den gleichen effekt, aber dein Fenster bleibt funktionell.

wenn die Lösung nicht funktioniert wie gewünscht, funktioniert der Eventfresser auch nicht, dann liegt es woanders dran.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Kaeru Gaman hat geschrieben:also, die Procedure die die Daten vom externen programm holt frisst alle events ohne drauf zu reagieren, nur damit die liste life angezeigt wird.
das ist das was While WindowEvent():Wend macht.

... und das war auch das, worüber Kiffi und ich gesprochen haben:
wenn du dein WaitWindowEvent() mit einem timeout versiehst,
und dein Auslesen und Zeile dazusetzen nur durchführst, wenn kein Event anliegt,
dann erreichst du den gleichen effekt, aber dein Fenster bleibt funktionell.

wenn die Lösung nicht funktioniert wie gewünscht, funktioniert der Eventfresser auch nicht, dann liegt es woanders dran.
naja das fenster freezed ja nicht... nur scheinbar das Listgadget... hat das vermutlich den selben Grund?

PS.: du hast nicht zufällig einen IM oder? falls ja würd ich mich freuen, wenn du mir vllt über ICQ o.ä. helfen könntest?

werde nun off gehen und morgen wieder nachsehen - gruß und gute nacht^^
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

hjbremer hat geschrieben:hier mal eine kleine Demo

zuerst das Consolenprogramm, als Exe compilieren

Code: Alles auswählen

 If OpenConsole()
  
    For j = 1 To 500
    
      PrintN(Str(j) + " dies ist ein Test.")
      Delay(20)
    
    Next
    
 EndIf

und nun die Demo zum einlesen

Code: Alles auswählen

Procedure ReadProgData(file$,listpbnr) 

      anz = 0
      zeile$ = ""
      listid = GadgetID(listpbnr)
    
      nr = RunProgram(file$, "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)
      
      If nr  
        
        While ProgramRunning(nr) 
          
            zeile$ = ReadProgramString(nr) 
            AddGadgetItem(listpbnr, -1, zeile$)
            
            anz=SendMessage_(listid, #LVM_GETITEMCOUNT, 0, 0) - 1 
            SendMessage_(listid, #LVM_ENSUREVISIBLE, anz, #True) 
    
            While WindowEvent() : Wend 
          
        Wend 
        
     EndIf   
    
     CloseProgram(nr)

ProcedureReturn anz

EndProcedure


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) 

Debug ReadProgData("testconsole.exe", list)

Repeat
 event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

End 
 
Das entscheidende ist While WindowEvent() : Wend
Bei Bedarf kann auch noch ein Delay(x) dazwischen gesetzt werden
dein Beispiel klappt einwandfrei!!
aber:
Mit meinem Programm funktioniert der gleiche Vorgang nicht!
Da erscheinen die Einträge dann auch erst nach Beenden des Programms...
Was ist also das Problem? Sollte ich lieber readprogramdata() verwenden?
Zur info: mein Programm ist auch eine consolen anwendung^^

//edit//
mit readprogramdata() freezed die Anzeige auch, solange, bis das Programm beendet wurde... :(
es handelt sich um einen AIM client aus dem SDK...
http://rapidshare.com/files/178846694/imcore.rar falls jmd testen will. alle nötigen dateien im archiv enthalten. (achtung pfade müssen erhalten bleiben!)
warum will diese simple GUI nicht klappen?!
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

push!!
gibts keine Ideen, woran es liegt?!
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Read/Write inkompatibel zu manchen consolen bzw verzöger

Beitrag von KeyKon »

benji hat geschrieben:...komischerweise will sich mein Listgadget nicht in echtzeit mit der Ausgabe der Console synchronisieren. Sondern erst nach dem Beenden des gestarteten Programms erscheinen alle texte...
Ich bin nun auf das gleiche Problem gestoßen und pushe deshalb diesen Thread mal wieder nach oben.
Vll hat ja inzwischen jemand ne Lösung dafür. (Notfalls auch per API/Windows only)

In meinem Fall will ich mittels 7zip etwas automatisch entzippen oder zippen, per Hand in der Console werden hier die Daten schön zum richtigen Zeitpunkt ausgegeben, aber wenn ich versuche das stdout per PureBasic einzulesen kommt erst alles auf einmal wenn der Vorgang abgeschlossen ist und 7z.exe beendet hat.

Hier mal ein Beispielcode fürs entzippen den jeder (der 7zip drauf hat testen kann), Pfade und evtl. Pwd müssen natürlich korrekt angepasst haben, weil bei Fehlermeldungen bricht 7zip sofort ab und dann funktioniert natürlich auch die Ausgabe just in time^^:

Code: Alles auswählen

pfad$ = "C:\file.zip"
out$  = "C:\"
pwd$  = "bla"

prg = RunProgram("C:\Programme\7-zip\7z.exe","e "+Chr(34)+pfad$+Chr(34)+" -o"+Chr(34)+out$+Chr(34)+" -p"+Chr(34)+pwd$+Chr(34)+"","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Error|#PB_Program_Hide)

If prg
  Debug "Start"
  Repeat
    Delay(10)
    
    While AvailableProgramOutput(prg)
      Debug ReadProgramString(prg)
    Wend
  Until ProgramRunning(prg) = 0
  Debug "Close"
  CloseProgram(prg)
EndIf
Würde mich wirklich über eine Lösung freuen da ich sonst während dem Vorgängen überhaupt keine Rückmeldungen von 7zip hab, was bei großen Files etwas mühselig ist...

LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Read/Write inkompatibel zu manchen consolen bzw verzöger

Beitrag von bobobo »

das if ist irgendwie blöd
mach mal lieber so (hier werden Fehler durch die Autoantwort mit -y eventuell vermieden. trotzdem Name und Pfad anpassen

Code: Alles auswählen

pfad$ = "D:\file.zip"
out$  = "D:\"
pwd$  = "bla"
prg = RunProgram("D:\Programme\7-zip\7z.exe","e "+Chr(34)+pfad$+Chr(34)+" -o"+Chr(34)+out$+Chr(34)+" -p"+Chr(34)+pwd$+Chr(34)+" -y","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Error|#PB_Program_Hide)
While ProgramRunning(prg)
  While AvailableProgramOutput(prg)
    Debug ReadProgramString(prg)
    Debug "Ach sieh an , 'ne Ausgabe":Delay(200)
  Wend
Wend
Debug "Close"
CloseProgram(prg)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten