Abbruchmöglichkeit gesucht

Anfängerfragen zum Programmieren mit PureBasic.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Abbruchmöglichkeit gesucht

Beitrag von Re57 »

Hallo zusammen, in meinem Programm kann man Töne abspielen lassen. Allerdings gibt es dabei leider keine Abbruchmöglichkeit, ich muß also warten, bis das Abspielen fertig ist. Meine Frage nun ist, warum eine Bedingung mit KeyboardPushed() in der For-Next-Schleife nicht geht, bzw. wie man da überhaupt eine Abbruchbedingung realisieren könnte. Hier das Funktionsprinzip:

Code: Alles auswählen

For i = 1 to cnt
  ton = Toene(i-1)
  Select ton

    Case 1
    PlaySound(1)
    Delay(1000)
    StopSound(1)

    Case 3
    PlaySound(2)
    Delay(1000)
    StopSound(2)

    Case 3
    PlaySound(3)
    Delay(1000)
    StopSound(3)

    Endselect
    event = WaitWindowEvent(5)
 next
Danke für Tipps.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Abbruchmöglichkeit gesucht

Beitrag von STARGÅTE »

Was meinst du mit "Abbruchmöglichkeit"?
Meinst du hier das Delay(1000) abbrechen? Generell sollte man auf harte Delays verzichten.

Statt dessen kannst du nach dem Abspielen einfach ein AddWindowTimer() erstellen mit einem Timeout von z.B. 1000 ms.
Nach diesen 1000 ms wird ein WindowEvent ausgelöst, worauf zu reagieren kannst.
Alternativ, kannst du KeyboardPushed() im Screen oder AddKeyboardShortcut() im Window nutzen um vorzeitig das Abspielen zu beenden.
Das ganze funktioniert jedoch nur mit einer "intakten" Event-Schleife.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Abbruchmöglichkeit gesucht

Beitrag von STARGÅTE »

Re57 hat geschrieben:Kann mir bitte mal jemand einen kurzen Beispiel-Code schreiben, wie man innerhalb einer For-Next-Schleife einen Abbruch z.B. über die Escape-Taste erzeugt?
Dafür kann man dir sicher einen Code schreiben, allerdings würde ich es gerne vermeiden, weil es die falsche Herangehensweise ist.
Daher hier mal ein Beispiel, wie man dein Töne-Abspielen mit Timer lösen kann.

Code: Alles auswählen

Enumeration
	#Window
	#Gadget_Play
	#Gadget_Stop
	#Timer
EndEnumeration

OpenWindow(#Window, 0, 0, 200, 40, "Play and Stop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#Gadget_Play, 10, 10, 80, 20, "Play")
ButtonGadget(#Gadget_Stop, 110, 10, 80, 20, "Stop")

Define Ton.i
Define MaxTon.i = 5

Repeat
	
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			CloseWindow(#Window)
			End
		Case #PB_Event_Timer
			Select EventTimer()
				Case #Timer
					; Es sind 1000 ms vergangen, also "alten" Ton stoppen, Ton um eins erhöhen und "neuen" Ton starten wenn erwünscht, sonst Timer löschen.
					Debug "Stop Ton "+Str(Ton) ; hier kommt dein StopSound() hin.
					If Ton < MaxTon
						Ton + 1
						Debug "Play Ton "+Str(Ton) ; hier kommt dein PlaySound() hin.
					Else
						RemoveWindowTimer(#Window, #Timer)
					EndIf
			EndSelect
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #Gadget_Play
					; Play setzt Ton auf 1, beginnt das abspielen und erstellt einen Timer mit 1000 ms
					Ton = 1
					Debug "Play Ton "+Str(Ton) ; hier kommt dein PlaySound() hin.
					AddWindowTimer(#Window, #Timer, 1000)
				Case #Gadget_Stop
					; Stop stoppt das abspielen und löscht den Timer
					Debug "Stop Ton "+Str(Ton) ; hier kommt dein StopSound() hin.
					RemoveWindowTimer(#Window, #Timer)
			EndSelect
	EndSelect
	
ForEver
Edit: Diese Antwort galt einem inzwischen gelöschten Post von Re57
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Abbruchmöglichkeit gesucht

Beitrag von Re57 »

Vielen Dank, Stargate. Leider jedoch habe ich wegen Provider-Wechsel derzeit kein Internet am Laptop (nur auf dem Smartphone über Mobilfunk) sodaß ich mich jetzt leider erstmal nicht näher mit Deinem Code beschäftigen kann. Ich werde das aber später natürlich machen. Ich selber hatte zwischenzeitlich versucht, über AddKeyboardShortcut() und dann mit den Abfragen über WaitWindowEvent() und #PB_Event_Menu und EventMenu() weiterzukommen, aber das ging nicht, auch nicht nach Umwandlung von For-Next in Repeat-Until. Ich lasse das Problem jetzt erstmal liegen, bis ich bald wieder Internet auch am Laptop habe.

Mich würde aber jetzt auch mal noch etwas ganz anderes interessieren: Es gibt ja Programme, die auf einen Ordner zugreifen und auch bei meinem aktuellen Code ist das so. Gibt es eigentlich eine Möglichkeit, dann ein Executable so zu erstellen, daß der Ordner dann gleich fest mit dem Programm verankert ist, sprich, daß man dann den ursprünglichen Ordner gar nicht mehr braucht? Vielleicht wird das aber so kompliziert, daß ich als Laie das nicht schaffen kann. Ich hatte auch schon früher mal ein Programm erstellt mit einem Ordner dabei (Spiel mit Karten), und hatte das auch Verwandten zugeschickt, aber gerade chique ist das ja nicht mit so einem Extra-Ordner dabei. Danke.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Abbruchmöglichkeit gesucht

Beitrag von Mijikai »

Prinzipiell kann alles in die Exe eingebunden werden (IncludeBinary).
Optional gibt es auch oft entsprechende OS-APIs wie z.B. die Resource APIs bei Windows.
https://docs.microsoft.com/en-us/window ... adresource
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Abbruchmöglichkeit gesucht

Beitrag von Re57 »

Vielen Dank, IncludeBinary war genau das Stichwort, was ich gesucht hatte. Mittlerweile habe ich schon darüber in der Referenz gelesen (ein super Buch ist das und da werde ich ab jetzt intensiv rein sehen) IncludeBinary werde ich bald mal ausprobieren.
Antworten