Gui und Delay

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Gui und Delay

Beitrag 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
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Gui und Delay

Beitrag von Derren »

Guck mal in der Hilfe nach AddWindowTimer() ;)
Signatur und so
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Gui und Delay

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Gui und Delay

Beitrag 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...
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Gui und Delay

Beitrag 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
PB 4.00 | Windows XP Home SP3
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Gui und Delay

Beitrag 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
Signatur und so
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Gui und Delay

Beitrag 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:
PB 4.00 | Windows XP Home SP3
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Gui und Delay

Beitrag 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.
Signatur und so
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Gui und Delay

Beitrag 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:
PB 4.00 | Windows XP Home SP3
Antworten