[Erledigt] Thread wegen 2 Sekunden warten?

Anfängerfragen zum Programmieren mit PureBasic.
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

[Erledigt] Thread wegen 2 Sekunden warten?

Beitrag 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
Zuletzt geändert von Ractur am 05.04.2012 14:27, insgesamt 1-mal geändert.
Ractur, der mit dem Programmierstil der 80er Jahre :D
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Thread wegen 2 Sekunden warten?

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Thread wegen 2 Sekunden warten?

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Ractur
Beiträge: 128
Registriert: 24.06.2008 11:51

Re: Thread wegen 2 Sekunden warten?

Beitrag 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
Ractur, der mit dem Programmierstil der 80er Jahre :D
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Thread wegen 2 Sekunden warten?

Beitrag 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
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten