Seite 1 von 2
InitNetwork / MessageRequester
Verfasst: 18.10.2020 01:02
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
Re: InitNetwork / MessageRequester
Verfasst: 18.10.2020 09:48
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?
Re: InitNetwork / MessageRequester
Verfasst: 19.10.2020 11:21
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
Re: InitNetwork / MessageRequester
Verfasst: 19.10.2020 18:29
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
Re: InitNetwork / MessageRequester
Verfasst: 21.10.2020 10:48
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
Re: InitNetwork / MessageRequester
Verfasst: 21.10.2020 11:17
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:
Re: InitNetwork / MessageRequester
Verfasst: 21.10.2020 15:15
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
Re: InitNetwork / MessageRequester
Verfasst: 21.10.2020 21:03
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.
Re: InitNetwork / MessageRequester
Verfasst: 22.10.2020 07:49
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.
Re: InitNetwork / MessageRequester
Verfasst: 22.10.2020 08:28
von HeX0R