Seite 1 von 1

Gui und Delay

Verfasst: 04.07.2012 17:40
von kunstlust
Ich habe eine Frage warum an diesem Beispiel der Delay dazu führt, das die Anwendung steht? Wie erreiche ist, das mein Programm warte, der User aber nichts mitbekommt? Mir ist klar das dieses Beispiel hier QUATSCH ist, aber selbst beim einem Sprung in eine Prozedur, ist es dasselbe. Ich will, sagen wir im Hintergrund ein Log alle 30 Sekunden herunterladen und bei neue Id anzeigen lassen, das funktioniert auch aber das Delay führt dazu, das die CPU-Auslastung immer bei 5% liegt und ich würde gerne, die eben nur beim wirklichen abruf sehen. Das Beispiel soll ja nur als Grundlage zu meinem Verständnis dienen, wie ich etwas anderes anderes berechnen kann, ohne die GUI zu stören? Danke für einen kleinen Tip

Code: Alles auswählen

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,100,0)
  ButtonGadget(2,10,120,100,20,"Ausschneiden",0)
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_Gadget
  Select EventGadget()
   Case 2
     SendMessage_(GadgetID(1),#WM_CUT,0,0)
  EndSelect
EndIf
Delay(100)
Until EventID = #PB_Event_CloseWindow
EndIf

Re: Gui und Delay

Verfasst: 04.07.2012 18:01
von Derren
Guck mal in der Hilfe nach AddWindowTimer() ;)

Re: Gui und Delay

Verfasst: 04.07.2012 18:02
von ts-soft
Für Dein Log solltest Du einen Timer nutzen. Das Log-Schreiben selber wird ja nur wenige ms dauern. Ansonsten helfen nur Threads.

Gui und Delay

Verfasst: 04.07.2012 21:55
von kunstlust
Danke für die Hilfe, das mit dem Timer wird hoffe ich reichen. Ich lese aber ein Log ein, von einer Mobydick Telefonanlage per Rest und such die Name aus einer SQL Datenbank, was auch schon geht, aber schön ist was anderes...

Re: Gui und Delay

Verfasst: 04.07.2012 22:17
von Rebon
Bin mir nicht sicher ob dir das mit dem Log dann helfen würde, aber bei deinem Beispielcode würde ich die Verzögerung einfach in WaitWindowEvent setzen.

Code: Alles auswählen

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,100,0)
  ButtonGadget(2,10,120,100,20,"Ausschneiden",0)
Repeat
EventID=WaitWindowEvent(100)
If EventID=#PB_Event_Gadget
  Select EventGadget()
   Case 2
     SendMessage_(GadgetID(1),#WM_CUT,0,0)
  EndSelect
EndIf
;Delay(100)
Until EventID = #PB_Event_CloseWindow
EndIf

Re: Gui und Delay

Verfasst: 04.07.2012 23:14
von Derren
Rebon, das bringt nix, bei einem 30s Delay.
Wenn du deine Maus bewegst "feuerst" du etliche Events.
Wenn du jetzt einfach so was in den Mainloop reinklatscht wird das auch zig mal pro Sekunde ausgeführt (und dein Programm wird stocken, wenn diese Aktion länger als ein paar ms dauert).


Hier, mal ein Beispiel mit 30 Sekunden Delay.
Alle 30 Sek wird eine Textdatei ausgelesen (Pfad evtl. anpassen) und in das StringGadget gepastet (nur die erste Zeile).

Code: Alles auswählen

EnableExplicit 

Enumeration 
	#Window
EndEnumeration

Enumeration
	#StringGadget
	#EditorGadget
	#ButtonGadget
EndEnumeration

Enumeration 
	#File
EndEnumeration

#FilePath = "C:\testfile.txt"


OpenWindow(#Window, 0, 0, 400, 300, "Delay Test", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
StringGadget(#StringGadget, 5, 5, 390, 20, "")
EditorGadget(#EditorGadget, 5, 30, 390, 200)
ButtonGadget(#ButtonGadget, 5, 235, 390, 60, "Aus EditorGadget ausschneiden")

Define.i EventID
Define.i TimerID
Define.i TimerLenght = 30000


AddWindowTimer(#Window, TimerID, TimerLenght)


Repeat
	EventID=WaitWindowEvent(20)
	
	Select EventID
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #ButtonGadget
					SendMessage_(GadgetID(#EditorGadget),#WM_CUT,0,0)
			EndSelect
			
		Case #PB_Event_Timer
			If EventTimer() = TimerID
				ReadFile(#File, #FilePath)
				SetGadgetText(#StringGadget, ReadString(#File))
				CloseFile(#File)
			EndIf
EndSelect 
Until EventID = #PB_Event_CloseWindow

Re: Gui und Delay

Verfasst: 06.07.2012 09:52
von Rebon
Derren hat geschrieben:Rebon, das bringt nix, bei einem 30s Delay.
Wenn du deine Maus bewegst "feuerst" du etliche Events.
Wenn du jetzt einfach so was in den Mainloop reinklatscht wird das auch zig mal pro Sekunde ausgeführt (und dein Programm wird stocken, wenn diese Aktion länger als ein paar ms dauert).
Derren, dass ist mir klar, ich habe extra dazu geschrieben, dass es sich auf das Codebeispiel bezieht. :wink:

Re: Gui und Delay

Verfasst: 06.07.2012 15:27
von Derren
Aber in dem Codebeispiel wurde doch gar nix ausgeführt (weshalb das Beispiel auch total sinnlos war).
Dein Beispiel war deshalb genauso sinnlos, imho.
Da wird ja nur gewartet, wenn der User nicht aktiv ist. Wenn der ständig die Maus bewegt wird eben nicht gewartet, sondern zig mal pro Sekunden ausgeführt.

Re: Gui und Delay

Verfasst: 06.07.2012 15:43
von Rebon
Derren hat geschrieben:Aber in dem Codebeispiel wurde doch gar nix ausgeführt (weshalb das Beispiel auch total sinnlos war).
Dein Beispiel war deshalb genauso sinnlos, imho.
Da wird ja nur gewartet, wenn der User nicht aktiv ist. Wenn der ständig die Maus bewegt wird eben nicht gewartet, sondern zig mal pro Sekunden ausgeführt.
Aber genau das hat der doch am Anfang gefragt.
Ich habe eine Frage warum an diesem Beispiel der Delay dazu führt, das die Anwendung steht? Wie erreiche ist, das mein Programm warte, der User aber nichts mitbekommt?
Und ich habe diese Frage damit beantwortet, nicht mehr und nicht weniger. Und ich habe doch auch am Anfang geschrieben, dass ich nicht weiß, ob das mit dem Log so wie er sich das vorstellt funktioniert, um genau solchen Diskussionen aus dem Weg zu gehen.

Hat aber leider nicht funktioniert, vielleicht muss ich mich noch präziser artikulieren.

Wenn es so ist, wie du es beschrieben hast, dann ist es natürlich sinnlos, hatte ich ebenfalls schon geschrieben. :wink: