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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

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

Beitrag von benji »

Soo...
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.
Zudem will Findstring und die darauf folgenden Aktionen auch iwie nicht klappen...

der Menübefehl #stop klappt einwandfrei... ich muss nur leider raten, wann ich ihn benutzen darf....

Code: Alles auswählen

UIN.s = "465879999"
pw.s = "123456"

IncludeFile "joe_gui_include.pb"

Open_ICQ("0.1")

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  ;You can place code here, and use the result as parameters for the procedures
  
  If Event = #PB_Event_Menu
    
    MenuID = EventMenu()
    
    If MenuID = #open       
      ClearGadgetItemList(#joeoutput)
      ext.s = GetExtensionPart(file2open.s)
      ICQ = RunProgram("imcore/bin/base/accbuddy.exe" ,UIN +" "+ pw , "" , #PB_Program_Open | #PB_Program_Read | #PB_Program_Error |#PB_Program_Write)
      pos = -1
;       AddGadgetItem(#joeoutput, pos, "test")
      started = 1
  
    ElseIf MenuID = #stop
;       If ready
                WriteProgramStringN(ICQ, "im:nd ICQNR") ; anstelle von ICQNR die ziel ICQ# eingeben
                Delay(1000)
          WriteProgramStringN(ICQ, "im:s test!!")
          Delay(1000)
      WriteProgramStringN(ICQ, ":q")
;       Else
;       MessageRequester("ERROR", "Account not yet ready.")   
;       EndIf
       
     
    ElseIf MenuID = #exit
      End
            
    ElseIf MenuID = #MENU_7
      Debug "GadgetID: #MENU_7"
      
    ElseIf MenuID = #settings
      Debug "GadgetID: #settings"
      MessageRequester("Sorry...", "This option is not jet implied.")
      
    ElseIf MenuID = #hilfe
      MessageRequester("Helpfile", "hier könnte eine Hilfe-Datei geladen werden.")
      
    ElseIf MenuID = #about
      MessageRequester("About", "ICQ GUI" +Chr(10)+"----------" +Chr(10)+ "Coded by ")
      
    EndIf
    
  EndIf
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #joeoutput
      
    ElseIf GadgetID = #Button_2
      filename.s = GetFilePart(file2open)
      curr_date.s = FormatDate("%dd.%mm.%yyyy", Date())
      saveto.s = SaveFileRequester("Save log to...", "jb_"+curr_date.s+"_"+filename.s+".log", "LogFiles | *.log",0)
      If StringByteLength(saveto) > 2
      CreateFile(0, saveto)
      WriteStringN(0, "ICQ Security Console Output Logfile")
      WriteStringN(0, "--------------------------------------")
      counted_entries = CountGadgetItems(#joeoutput)
      While counted_entries <> loopcount
      WriteStringN(0,GetGadgetItemText(#joeoutput, loopcount))
      loopcount + 1
      Wend
      CloseFile(0)
      MessageRequester("Done", "File created!")  
      EndIf    
      
    EndIf
    
  EndIf
  
    If started
     If ProgramRunning(ICQ)
      If AvailableProgramOutput(ICQ)
;       Debug ReadProgramString(ICQ)
        im_string.s = ReadProgramString(ICQ)        
        If FindString(im_string, UIN + " is online.", 0)
          ready = 1
          WriteProgramStringN(ICQ, "im:nd ICQNR") ; anstelle von ICQNR die ziel ICQ# eingeben
          WriteProgramStringN(ICQ, "im:s test!!")
          EndIf
          
        If FindString(im_string, "ACC_E_RATE_LIMITED", 5)
          MessageRequester("ERROR", "Too much server activity has happened too quickly.")          
          EndIf
        AddGadgetItem(#joeoutput, pos, im_string)
        If StringByteLength(ReadProgramError(ICQ)) <> 0
          AddGadgetItem(#joeoutput, pos, "[ERROR]" + ReadProgramError(ICQ))
        EndIf
        
;         pos + 1
        EndIf
        Else
        started = 0
       AddGadgetItem(#joeoutput, pos,"Exitcode: " + Str(ProgramExitCode(ICQ)))               
      EndIf 

      EndIf
Until Event = #PB_Event_CloseWindow ; End of the event loop

End
;

Vllt habt ihr ideen?


Ich danke vielmals und wünsche schöne Restfeiertage :)

//edit//
scheinbar sind manche Programme (nicht PB-Compiliert) Inkompatibel zu ReadProgramString(). Die Programme werden zwar eingelesen allerdings erfolgt die Ausgabe sowie interaktion erst nach beenden des Programms....
Ideen?
Zuletzt geändert von benji am 15.01.2009 19:43, insgesamt 3-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hast du denn in der schleife, die deine liste füllt, eine Eventverarbeitung drin?

Fenster und Gadgets werden erst aktualisiert, wenn die Events abgearbeitet werden.
ohne dem kannst du so viel verändern wie du willst, man sieht nix davon.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

ich würde dir empfehlen mal ein Beispiel zu benutzen, das auch funktioniert.

Ja ich weiß, ich nerve damit... :)
Win11 x64 | PB 6.20
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Kaeru Gaman hat geschrieben:hast du denn in der schleife, die deine liste füllt, eine Eventverarbeitung drin?

Fenster und Gadgets werden erst aktualisiert, wenn die Events abgearbeitet werden.
ohne dem kannst du so viel verändern wie du willst, man sieht nix davon.
eh nein.... was muss ich da machen!?! also mit events hab ich mich bisher nicht sonderlich auseinandergesetzt.
Ich sags mal so:
wenn das Programm läuft und die externe Anwendung gestartet wird, dann habe ich immernoch zugriff auf das Menü und den Button. Wenn ich irgendwas klicke dann erscheinen aber auch keine Einträge in der Liste.

//edit//
Ich habe erwartet, dass bei jedem neu auftretenden Consolen Text einfach eine Zeile in der Liste auftaucht, die ich dann sehen kann.
Komischerweise tauchen diese erst nach dem beenden vom Programm auf! Das Programm ist wärend der runtime voll ansprechbar, ich weiß nur nicht, was es tut (weil eben alle Texte erst erscheinen, nachdem das Programm beendet wurde.). Auch komisch ist, dass das Auslesen und Findstring und das automatische "antworten" auf eine Ausgabe auch nicht funktioniert!!

@Andesdaf:
ohne die externe Anwendung gehts doch eh nicht... :?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das war jetzt auch nur ins blaue geraten, weil das ein beliebter fehler ist.

mir fällt auf, dass du die Befehle AddGadgetItem in einem If in der Hauptschleife stehen hast, das bei jedem durchlauf bearbeitet wird.

möglicherweise blockiert das die vernünftige verarbeitung, weil ständig neue Add-Events zugesetzt werden und nicht anständig abgearbeitet...
aber das ist auch nur geraten.

ohne die ganzen Joes ist das auch ein bissel schwierig zu durchblicken, und testen ist ja garnicht möglich.

ich hab jetzt auch nicht die Muße, einen test zu schreiben der beispielsweise ne textdatei zeilenweise ausliest, um diese grundkonstruktion für die eventschleife mal durchzutesten.
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:das war jetzt auch nur ins blaue geraten, weil das ein beliebter fehler ist.

mir fällt auf, dass du die Befehle AddGadgetItem in einem If in der Hauptschleife stehen hast, das bei jedem durchlauf bearbeitet wird.

möglicherweise blockiert das die vernünftige verarbeitung, weil ständig neue Add-Events zugesetzt werden und nicht anständig abgearbeitet...
aber das ist auch nur geraten.

ohne die ganzen Joes ist das auch ein bissel schwierig zu durchblicken, und testen ist ja garnicht möglich.

ich hab jetzt auch nicht die Muße, einen test zu schreiben der beispielsweise ne textdatei zeilenweise ausliest, um diese grundkonstruktion für die eventschleife mal durchzutesten.
alles klar...
das mit der If schleife... vllt bringts schon ein simpler delay?
werde noch etwas rumspielen.
Falls es nicht klappt lade ich alles mal hoch ;)
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@benji: versehe Dein WaitWindowEvent() mal mit einem Timeout.
benji hat geschrieben:das mit der If schleife...
http://www.if-schleife.de/

Grüße ... Kiffi
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Win11 x64 | PB 6.20
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Kiffi hat geschrieben:@benji: versehe Dein WaitWindowEvent() mal mit einem Timeout.
benji hat geschrieben:das mit der If schleife...
http://www.if-schleife.de/

Grüße ... Kiffi
eh ja sry xD
hab mal was falsches gesagt :D

//edit//
naja timeout hatte leider keine Auswirkungen... der text wird trotzdem erst nach dem beenden des Programms dargestellt...
CloseProgram(Programm) hat geschrieben:Schließt die Verbindung mit dem angegebenen Programm (gestartet mit RunProgram()) und gibt alle zugehörigen Daten frei.
heißt das es ist vorherbestimmt, dass ich nichts dagegen tun kann? und auf jeden Fall warten MUSS bis er mit den daten rausrückt?
Falls ja, wie sind dann an Ausgaben angepasste aktionen vom kontrollierenden Programm möglch?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Kiffi hat geschrieben:@benji: versehe Dein WaitWindowEvent() mal mit einem Timeout.
und dazu noch deinen If-Block in ein

Code: Alles auswählen

If Event = #Null
;...
EndIf
einschließen.

damit stellst du sicher, dass nur dann das nächste element gelesen wird, wenn alle events bearbeitet sind.

edith
das "freigeben" bedeutet nur, dass wenn dein gestartetes programm eine File geöffnet hatte, es nach CloseProgram wieder zum Zugriff zur Verfügung steht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten