InitNetwork / MessageRequester

Anfängerfragen zum Programmieren mit PureBasic.
Lucky
Beiträge: 3
Registriert: 17.10.2020 01:06
Computerausstattung: Ubuntu / Lubuntu 18.04 LTS (x86_64), PureBasic 5.72
Wohnort: Monheim am Rhein

InitNetwork / MessageRequester

Beitrag von Lucky »

Hallo,
ich möchte gern eine Internetseite downloaden und als Textdatei speichern (mit ReceiveHTTPFile) - das Speichern des Downloads funktioniert.
ABER:

Egal, ob ich den entsprechenden Programmabschnitt mit dem InitNetwork von einem Menü aus aufrufe, oder (siehe Codebeispiel) vorher noch einen MessageRequester eingesetzt habe, es passieren die unerklärliche Dinge ! Ich vermute, dass durch den Aufruf InitNetwork die Windows-Events beeinflusst werden - kann das sein ? .. und wie kann man das vermeiden ?

Ok, ich bin PureBasic Anfänger - finde aber in der Doku keine Erklärung für das Problem. Freue mich auf ein Feedback.
Lucky

Beispiel-Programm für Ubuntu 18.04 LTS, Lubuntu (X86_64)

Code: Alles auswählen

ExamineDesktops()
Define.c Breite, Hoehe
Breite = DesktopWidth(0)
Hoehe = DesktopHeight(0)
Define.i J_N

OpenWindow(0,0,0,Breite,Hoehe,"Test Internet")

J_N = MessageRequester("Frage:", "Internetseite Holen ?", #PB_MessageRequester_YesNo)
If J_N = #PB_MessageRequester_No
  End
EndIf
 
InitNetwork()
 
; Zeit um zu verdeutlichen, dass der MessageRequester nicht - wie zu erwarten - sofort verschwindet !
Delay (2000) 

; XXXX bitte bei der Ziel-Adresse den jeweiligen User-Namen eingetragen !
ReceiveHTTPFile("https://www.tagesschau.de/", "/home/XXXX/Seite.txt")

; Text so positionieren, dass er an der Position des Messagerequestors geschrieben werden soll
Hoehe = Hoehe/2
Breite = Breite/2 -230

StartDrawing(WindowOutput(0))
FrontColor(RGB(0,0,0))
BackColor(RGB(240,240,240))
DrawText(Breite, Hoehe,"Hello World - Hello World - Hello World - Hello World - Hello World")
StopDrawing() 

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

End
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: InitNetwork / MessageRequester

Beitrag von ccode_new »

Hallo Lucky,

was für unerklärliche Dinge passieren den?
Egal, ob ich den entsprechenden Programmabschnitt mit dem InitNetwork von einem Menü aus aufrufe, oder (siehe Codebeispiel) vorher noch einen MessageRequester eingesetzt habe, es passieren die unerklärliche Dinge ! Ich vermute, dass durch den Aufruf InitNetwork die Windows-Events beeinflusst werden - kann das sein ? .. und wie kann man das vermeiden ?
Ein direktes Zeichnen auf das Fenster mit WindowOutput() ist zuvermeiden, weil ein Repaint den vorher dargestellten Inhalt vernichtet.

Dieses Repaint erfolgt hier automatisch.

Besser so ähnlich:

Code: Alles auswählen

ExamineDesktops()
Define.c Breite, Hoehe
Breite = DesktopWidth(0)
Hoehe = DesktopHeight(0)
Define.i J_N

OpenWindow(0,0,0,Breite,Hoehe,"Test Internet")


J_N = MessageRequester("Frage:", "Internetseite Holen ?", #PB_MessageRequester_YesNo)
If J_N = #PB_MessageRequester_No
  End
EndIf

InitNetwork()

;Zeit um zu verdeutlichen, dass der MessageRequester nicht - wie zu erwarten - sofort verschwindet !
Delay (2000)

;XXXX bitte bei der Ziel-Adresse den jeweiligen User-Namen eingetragen !
ReceiveHTTPFile("https://www.tagesschau.de/", "/home/XXXX/Seite.txt")

; Text so positionieren, dass er an der Position des Messagerequestors geschrieben werden soll


If CreateImage(0, Breite, Hoehe, 24, #PB_Image_Transparent)
  
  StartDrawing(ImageOutput(0))
  DrawingMode(#PB_2DDrawing_Transparent)
  Hoehe = Hoehe/2
  Breite = Breite/2 -230
  FrontColor(RGB(0,0,0))
  BackColor(RGB(240,240,240))
  DrawText(Breite, Hoehe,"Hello World - Hello World - Hello World - Hello World - Hello World")
  StopDrawing()
  
EndIf

ImageGadget(0, 0, 0, Breite, Hoehe, ImageID(0))

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

End
Was ist eigentlich das korrekte Problem ?
Was hat es damit aufsich:
;Zeit um zu verdeutlichen, dass der MessageRequester nicht - wie zu erwarten - sofort verschwindet !
Delay (2000)
Verschwindet der MessageRequester bei dir erst nach Ablauf des Delays, oder noch später, oder gar nicht?

Hast du auch schon mal den letzten Parameter bei ReceiveHTTPFile mit der Übergabe der Konstante #PB_HTTP_Asynchronous probiert?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Lucky
Beiträge: 3
Registriert: 17.10.2020 01:06
Computerausstattung: Ubuntu / Lubuntu 18.04 LTS (x86_64), PureBasic 5.72
Wohnort: Monheim am Rhein

Re: InitNetwork / MessageRequester

Beitrag von Lucky »

Vielen Dank an ccode_new für die schnelle Antwort; ich werde noch das ein- oder andere ausprobieren, um mein Anliegen besser zu verdeutlichen.
Wird aber etwas Zeit in Anspruch nehmen - bin jetzt erstmal weg.
Lucky
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: InitNetwork / MessageRequester

Beitrag von juergenkulow »

Hallo Lucky,

Code: Alles auswählen

; Gebe den HTML-Text der Internetseite tagesschau.de auf dem Bildschirm aus.
If 0=InitNetwork() ; Ist Netzwerk hergestellt?
  MessageRequester("Netzwerkfehler","InitNetwork() fehlgeschlagen.")
  End 1 ; Gebe Fehler Nummer 1 zurück.
EndIf 
URL$=InputRequester("Seite","Seite:","http://www.tagesschau.de/") ; Gebe eine Internet-Seite ein. 
*Buffer = ReceiveHTTPMemory(URL$) ; Lade die Internetseite in den Speicher *Buffer.
If *Buffer=0 ; Wenn das Laden nicht funktiert hat gebe eine Fehlermeldung aus und beende. 
  MessageRequester("Fehler","Konnte Internetseite nicht laden.")
  End 2
EndIf  
Text$ = PeekS(*Buffer,-1,#PB_UTF8) ; Wandle den Inhalt des *Buffer im UTF8-Format in Unicode String um.
ExamineDesktops() ; Ermittle Informationen über angeschlossene Bildschirme 
Flags = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget; Fenster-Parameter
If OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),URL$,Flags) ;Öffne ein Fenster 
  EditorGadget(0,0,0,DesktopWidth(0),DesktopHeight(0)) ; Erstelle ein Editor-Gadget.
  SetGadgetText(0, Text$)  ; Ändere den Inhalt auf Editor-Gadgets auf den geladenen Text. 
  Repeat ; Hauptschleife
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow ; Warte auf ALT-F4 Eingabe
  CloseWindow(0)
Else 
  MessageRequester("Fensterfehler","Konnte Fenster nicht öffnen.")
  End 3 
EndIf
FreeMemory(*Buffer) ; Gebe den Speicher *Buffer zurück.
If OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),URL$,Flags) ;Öffne ein Fenster 
  WebGadget(0, 0, 0, DesktopWidth(0),DesktopHeight(0), URL$) ; Erstelle ein WebGadget mit der URL$ Seite.
  ; WebSeite darstellen. 
  Repeat ; 2. Hauptschleife
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow ; Warte auf ALT-F4 Eingabe
Else 
  MessageRequester("Fensterfehler","Konnte Web-Fenster nicht öffnen.")
  End 4   
EndIf 

Code: Alles auswählen

; Ausgabe von DrawText bei #PB_Event_Repaint PB 5.72 Linux 64bit 
; 
ExamineDesktops() ; Ermittle Informationen über angeschlossene Bildschirme.
OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),"Test DrawText") ; Öffne ein Fenster.
Start=ElapsedMilliseconds() ; Stelle Zeitpunkt fest.
Startpaint=0 ; -1 male 0 Init 1..10 zähle #PB_Event-None
ende=#False 
Repeat ; ende
  Event=WindowEvent() ; Fand ein Ereignis statt?
;   If Event<>0
;     Debug Event
;   EndIf   
  Select Event ; Aufwahl Ereignis. 
    Case  -1 ;, #PB_Event_Minus1
      If Startpaint<>-1
        Startpaint=1 
      EndIf 
    Case #PB_Event_Repaint
      If Startpaint<>-1 ; Wenn noch nicht gemalt werden darf prüfe ob schon 0,2 Sekunden vorbei sind.
        If ElapsedMilliseconds()-Start>200 ; Nach 0,2 Sekunden darf gemalt werden. 
          Startpaint=-1
        EndIf
      EndIf 
      If Startpaint=-1 
        StartDrawing(WindowOutput(0))
        FrontColor(RGB(0,0,0))
        BackColor(RGB(240,240,240))
        DrawText(10,10,"Hello World - Hello World - Hello World - Hello World - Hello World")
        StopDrawing()
      EndIf 
    Case #PB_Event_CloseWindow
      ende = #True
    Case #PB_Event_None
      Delay(1) ;Wenn kein Ereignis auftritt warte 1 Millisekunde. 
      If Startpaint>=1 
        If Startpaint<10 ; Wenn Startpaint noch nicht 10 ist zähle es 1 hoch. 
          Startpaint+1
        Else  ; Wenn Startpaint auf 10 hochgezhält ist, darf gemalt werden.
          Startpaint=-1
          PostEvent(#PB_Event_Repaint) ; Rufe Event #PB_Event_Repaint über Ereigniswarteschleife auf. 
        EndIf
      EndIf 
    Default
  EndSelect
Until ende
CloseWindow(0)
End
Lucky
Beiträge: 3
Registriert: 17.10.2020 01:06
Computerausstattung: Ubuntu / Lubuntu 18.04 LTS (x86_64), PureBasic 5.72
Wohnort: Monheim am Rhein

Re: InitNetwork / MessageRequester

Beitrag von Lucky »

Wow !
Ich bin begeistert, daß dieses Forum so gut funktioniert !
Vielen Dank an juergenkulow und ccode_new !
Als Anfänger / Umsteiger habe ich von Euch wertvolle Tips erhalten.

Habe noch das ein- und andere ausprobiert und kann meine Frage jetzt besser formulieren; das vermeintliche Problem steht nicht nur in Zusammenhang mit InitNetwork().
Mein Vorhaben ist / war, daß ich von unterschiedlichen Programmstellen aus eine Daten-Aktualisierung aufrufen will - u.a. auch durch ein Menü-Item.

Ruft man per Menü-Eintrag Unterprogramme/Prozeduren auf, in denen keine neue Windows-Events vorkommen, erzeugt man Endlosschleifen.
Programmiert man aber innerhalb des aufgerufenen Unterprogramms z.B. ein MessageRequester, der neue WindowEvents zur Folge hat, ist die Welt wieder in Ordnung !

Um diese Verhalten nochmal anders zu verdeutlichen, siehe Code unten.
! Achtung ! ohne Auskommentierung der MessageRequester-Zeile kommt es zu einer Endlos-Schleife ! (zumindest bei mir).

Genau dieses Verhalten von PureBasic hatte mich als Anfänger sehr irritiert .. und hat mich auf die falsche Fährte mit InitNetwork .. DrawText .. usw. geführt.
Wie man es besser machen kann, weiss ich jetzt - Vielen Dank !

Gruß, Lucky

Code: Alles auswählen

Procedure Irgendwas()
  Define.s Text
  Text = "Blablablabla..."
  Debug Text
  Delay (2000);------Nur um zu verdeutlichen, daß Endlosschleife gegeben ist !!
  
  ;xxxx Wenn man ein neues WindowEvent erzeugt, wir die Endlos-Schleife unterbrochen xxxx
  ;xxxx Hier: MessageRequester aktivieren -> dann ist alles Gut ! xxxx
  ;MessageRequester("INFO", "Prozedur beendet !", #PB_MessageRequester_Ok)
  
EndProcedure
;------------------------------------------------------------------
ExamineDesktops()
Define.c Breite, Hoehe
Breite = DesktopWidth(0)
Hoehe = DesktopHeight(0)
OpenWindow(1,0,0,Breite,Hoehe,"Menü-Test")
;------------------------------------Menü-Einträge
CreateMenu(0, WindowID(1))
  MenuTitle(" Datei ")
  MenuItem(1, "Beenden")
  MenuTitle(" Problem  ")
  MenuItem(3," Start Porc ")
;------------------------------------Menü-Abfrage 
  Repeat
  Event = WaitWindowEvent()
  If #PB_Event_Menu
    If EventMenu() = 1
     Goto Finito
    EndIf
    If EventMenu() = 3
     Irgendwas();--------Pozeduraufruf
    EndIf
  EndIf
  Delay(2)      
Until Event = #PB_Event_CloseWindow
;-----------------------------------Beenden
Finito:
End
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: InitNetwork / MessageRequester

Beitrag von HeX0R »

Dein Beispiel ist Murks, ausserdem kommt es zu keiner "Endlosschleife"!
Es ist nur so, dass in Fensteranwendungen Delays überhaupt nichts verloren haben, so ein Fenster schickt viel mehr Events an die Queue als Du vielleicht denkst, und mit jedem Delay, wird die Abarbeitung unnötig verlangsamt.

Murks, wegen:

Code: Alles auswählen

If #PB_Event_Menu
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: InitNetwork / MessageRequester

Beitrag von juergenkulow »

Hallo Lucky,

Code: Alles auswählen

; Menü-Demo 
Procedure Irgendwas() ; Wird aufgerufen, wenn Menü Problem Start Porc geklickt wird. 
  Define.s Text
  Text = "Hallo sichtbares Universum, aus dem Orion-Arm."
  Debug Text
  ; Delay (2000);------Nur um zu verdeutlichen, daß Endlosschleife gegeben ist !!
  ; Dieses Delay könnte auch auskommentiert werden. 
  ;xxxx Wenn man ein neues WindowEvent erzeugt, wir die Endlos-Schleife unterbrochen xxxx
  ;xxxx Hier: MessageRequester aktivieren -> dann ist alles Gut ! xxxx
  ;MessageRequester("INFO", "Prozedur beendet !", #PB_MessageRequester_Ok)
  
EndProcedure
;------------------------------------------------------------------
ExamineDesktops()
Define.c Breite, Hoehe
Breite = DesktopWidth(0)
Hoehe = DesktopHeight(0)
OpenWindow(1,0,0,Breite,Hoehe,"Menü-Test")
;------------------------------------Menü-Einträge
CreateMenu(0, WindowID(1))
MenuTitle(" &Datei ") ; Alt-D
MenuItem(1, "&Beenden Alt-F4") ; b
MenuTitle(" &Problem  ") ;Alt-P
MenuItem(3," &Start Porc ") ;s
;------------------------------------Menü-Abfrage

Global Fini=#False
Repeat
  Event = WaitWindowEvent()
  If Event=#PB_Event_Menu  ; #PB_Event_Menu ist 1 damit ist if #PB_Event_Menu immer wahr.
                           ; Das ursprüngliche Programmstück nach dem If wird immer ausgeführt. 
                           ; If hat keine Wirkung! 
                           ; In der Dokumenation unter WindowEvent gibt es mehr zu Event. 
    If EventMenu() = 1
      ; Bitte Goto nur im äußersten Notfall benutzen. ; Goto Finito 
      Fini=#True 
    EndIf
    If EventMenu() = 3
      Irgendwas();--------Pozeduraufruf
    EndIf
  EndIf 
  If Event = #PB_Event_CloseWindow
    Fini=#True
  EndIf 
  ; Delay(2) ; Da bei WaitWindowEvent schon auf das nächste Ereignis gewarted wird, und anderene
  ; Programmen die Gelegenheit gibt ausgeführt zu werden, bremst das Delay hier nur 2 Millisekunden
  ; pro Ereignis. 
Until Fini ; Wiederhole bis Fini=#True nach ALT-F4 oder Menü Datei Beenden oder Fenster schließen.
;-----------------------------------Beenden
; Finito:
End
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: InitNetwork / MessageRequester

Beitrag von helpy »

Wenn von einem Fenster-Menü eine Routine aufgerufen wird, die seeeeehr lange dauert, dann wird diese Routine abgearbeitet und erst danach wieder zurückgesprungen in die WindowEvent-Schleife. D.h. während der Laufzeit der Routine wird keine Event-Behandlung durchgeführt.

Willst Du also in einer Routine, die aus der Event-Routine (z.B. bei Mausklick auf einen Button oder Aufruf eines Menüs), sehr lange Prozesse abarbeiten, dann musst Du Dich wohl oder übel mit Threads beschäftigen. Und das ist dann kein Anfänger-Thema mehr.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: InitNetwork / MessageRequester

Beitrag von juergenkulow »

Hallo helpy,

CreateThread, RunProgram, ElapsedMilliseconds oder RDTSC könnten helfen Dein Problem zu lösen. Bitte schicke Dein vereinfachtes Programm mit dem langen Prozess und mit Deinen praktischen Fragen in einem separatem Thema.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: InitNetwork / MessageRequester

Beitrag von HeX0R »

:freak: :mrgreen:
Antworten