Seite 1 von 1

[Erledigt] Thread wegen 2 Sekunden warten?

Verfasst: 05.04.2012 12:32
von Ractur
Hallo,

ich habe ein Feld indem Informationen erscheinen wenn der Benutzer z.b. eine bestimmten Button drückt. Wenn er den Button gedrückt hat, will ich die Information für X Sekunden erscheinen lassen und dann aber wieder zum Ursprungstext zurück kehren.

Code: Alles auswählen

        Case 6
            highscoreplusinfotexthold.s = highscoreplusinfotext.s
            highscoreplusinfotext.s = "     ...Einstellungen gespeichert..."
            TextGadget(7,52,40,180,113,highscoreplusinfotext.s)
            Delay(2000)
            highscoreplusinfotext.s = highscoreplusinfotexthold.s
            TextGadget(7,52,40,180,113,highscoreplusinfotext.s)
        EndSelect
    EndSelect
Das funktioniert soweit, allerdings hält er mir das ganze Programm an. Ich will aber das das Programm normal weiter läuft und nicht zum "Stillstand" kommt. Habs zwar mit ner Schleife probiert, aber da isses der selbe Effekt. Muß ich dazu nen Thread erstellen oder geht das auch einfacher?

Danke.. Ractur

Re: Thread wegen 2 Sekunden warten?

Verfasst: 05.04.2012 13:04
von Falko
Vielleicht in etwas so?

Code: Alles auswählen

Startzeit=ElapsedMilliseconds()
While ElapsedMilliseconds()-Startzeit<2000
  ;wartet hier
Wend
MessageRequester("Achtung","Zeit ist abgelaufen")  
Wenn Nötig, würde ich in der While Wend-Schleife
das WindowEvent() zusätzlich abfragen und
auf die gleiche Eventvariable legen wie im Hauptprogramm.

Gruß,
Falko

Re: Thread wegen 2 Sekunden warten?

Verfasst: 05.04.2012 13:24
von CSHW89
Dafür braucht man in der Regel keine Threads und auch keine zusätzliche Schleife zur Eventschleife. Hier mal ein kleines Beispiel:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 200, 40, "Hallo", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(0, 10, 10, 180, 20, "Klick mich")
  
  time = 0
  
  Repeat
    event = WaitWindowEvent(10) ; Parameter 10, damit in regelmäßigen Abständen WaitWindowEvent verlassen wird
    
    If (event = #PB_Event_Gadget)
      If (EventGadget() = 0)
        time = ElapsedMilliseconds() ; Setze Zeit zum Zeitpunkt des Klicks
      EndIf
    EndIf
    
    If (time <> 0) And (ElapsedMilliseconds() >= time+1000) ; Es sind nun 1000ms vergangen
      MessageRequester("Info", "Hab eine Sekunde gewartet")
      time = 0
    EndIf
    
  Until (event = #PB_Event_CloseWindow)
EndIf
lg Kevin

Re: Thread wegen 2 Sekunden warten?

Verfasst: 05.04.2012 13:39
von Ractur
@Falko
Danke! Ich hatte das schon so, allerdings hielt er mir dennoch die Ausführung an, wahrscheinlich weil die Schleife in der Hauptschleife is?

@CSHW89 :allright:

Funktioniert einwandfrei! Danke für den "Umdenkprozess" ;)

Grüsse Ractur

Re: Thread wegen 2 Sekunden warten?

Verfasst: 05.04.2012 14:33
von c4s
Noch einfacher als die von CSHW89 vorgeschlagene Lösung, wäre einen Timer zu verwenden:

Code: Alles auswählen

#Window = 0
#Gadget = 0
#Timer = 0


If OpenWindow(#Window, 0, 0, 200, 40, "Hallo", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	ButtonGadget(#Gadget, 10, 10, 180, 20, "Klick mich")

	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_Gadget
				Select EventGadget()
					Case #Gadget
						AddWindowTimer(#Window, #Timer, 1000) ; Setze Timer auf 1 Sek. zum Zeitpunkt des Klicks
				EndSelect

			Case #PB_Event_Timer
				If EventTimer() = #Timer  ; Es sind nun 1 Sek. vergangen
					Debug "Hab eine Sekunde gewartet"
					RemoveWindowTimer(#Window, #Timer)  ; Wieder entfernen
				EndIf

			Case #PB_Event_CloseWindow
				Break
		EndSelect
	ForEver
EndIf