Wie baut man einen Thread richtig auf?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Wie baut man einen Thread richtig auf?

Beitrag von Mijikai »

Beispiel ScrollBarGadget für die Lautstärke:

Code: Alles auswählen

EnableExplicit

Procedure.i Main()
  Protected *chip
  If InitSound()
    *chip = ReceiveHTTPMemory("https://api.modarchive.org/downloads.php?moduleid=44167#greenery.mod")
    If *chip
      If OpenWindow(0,0,0,400,400,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
        If ScrollBarGadget(1,260,50,20,300,0,100,10,#PB_ScrollBar_Vertical) And CatchMusic(0,*chip,MemorySize(*chip))
          SetGadgetState(1,50)
          MusicVolume(0,50)
          PlayMusic(0)
          Repeat
            Select WaitWindowEvent()
              Case #PB_Event_Gadget
                Select EventGadget()
                  Case 1
                    MusicVolume(0,GetGadgetState(1))
                EndSelect
              Case #PB_Event_CloseWindow
                Break
            EndSelect
          ForEver
        EndIf
        CloseWindow(0)  
      EndIf
      FreeMemory(*chip)
    EndIf
  EndIf
  ProcedureReturn #Null
EndProcedure

Main()

End
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Wie baut man einen Thread richtig auf?

Beitrag von jacdelad »

Statt der ganzen ExamineKeyboards würde ich es mit Shortcuts versuchen, die können direkt in der Ereignisschleife abgearbeitet werden. Siehe AddKeyboardShortcut.

Außerdem solltest du kein WaitWindowEvent in irgendwelche Subroutinen haben.

Des Weiteren könntest du das ScrollBarGadget mittels BindGadgetEvent() an eine Funktion binden, das kann eventuell die Blockierung aufheben, ich kann es aber momentan nicht testen.

Threads solltest du aber eigentlich nicht brauchen.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Wie baut man einen Thread richtig auf?

Beitrag von Re42 »

Den Ansatz mit Thread verfolge ich nicht weiter. Stattdessen weiß ich mittlerweile, wie man bei einem vertikalen TrackBarGadget die Ausrichtung des Pfeils nach links macht. Das wäre auf jeden Fall eine Lösung, aber optisch gefallen tut die mir eher weniger in dem Fall. Danke für die sonstigen Anregungen, die heute noch gekommen waren.
Zuletzt geändert von Re42 am 24.09.2022 12:51, insgesamt 2-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie baut man einen Thread richtig auf?

Beitrag von mk-soft »

Für die es wissen möchten wie man die Pfeilrichtung ändert und den Fokus-Rahmen entfernt. (OS-Windows)

Update: Kleine CanvasGadget Spielerei hinzugefügt ... (TrackBar in Prozent mit zwei Komma-Stellen)

Code: Alles auswählen

;-TOP

#ProgramTitle = "TrackBar Example"
#ProgramVersion = "v1.01.3"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainCanvas
  #MainTrackBarV
  #MainTrackBarH
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

Macro LOWORD(dwValue) : dwValue & $FFFF : EndMacro;
Macro HIWORD(dwValue) : dwValue >> 16 : EndMacro;

Macro MAKELPARAM( loWord, hiWord) : (hiWord << 16 | loWord) : EndMacro;
Macro MAKEWPARAM( loWord, hiWord) : (hiWord << 16 | loWord) : EndMacro;

Structure udtCanvasGadget
  Gadget.i
  BackColor.i
  BoxColor.i
  BoxSize.i
  LineColor.i
  TrackOffset.i
  TrackPosX.i
  TrackPosY.i
EndStructure

Global CanvasData.udtCanvasGadget

; ----

Procedure InitCanvas(Gadget, *Data.udtCanvasGadget)
  With *Data
    \Gadget = Gadget
    \BackColor = #White
    \BoxColor = #Red
    \BoxSize = 17
    \LineColor = #Gray
    CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Windows
        \TrackOffset = 13
      CompilerCase #PB_OS_Linux
        \TrackOffset = 3
      CompilerCase #PB_OS_MacOS
        \TrackOffset = 12
    CompilerEndSelect
  EndWith
  
EndProcedure

Procedure DrawCanvas(*Data.udtCanvasGadget)
  Protected dx, dy, deltaX, deltaY, PosX, PosY, Size2
  With *Data
    If StartDrawing(CanvasOutput(\Gadget))
      dx = GadgetWidth(\Gadget)
      dy = GadgetHeight(\Gadget)
      deltaX = dx - 2 * \TrackOffset - 1
      deltaY = dy - 2 * \TrackOffset - 1
      PosX = \TrackPosX * deltaX / 10000 + \TrackOffset
      PosY = \TrackPosY * deltaY / 10000 + \TrackOffset
      Size2 = \BoxSize / 2
      Box(0, 0, dx, dy, \BackColor)
      LineXY(0, PosY, dx, PosY, \LineColor)
      LineXY(PosX, 0, PosX, dy, \LineColor)
      Box(PosX - Size2, PosY - Size2, \BoxSize, \BoxSize, \BoxColor)
      ;Circle(PosX, PosY, Size2, \BoxColor)
      StopDrawing()
    EndIf  
  EndWith
  
EndProcedure

Procedure DoEventTrackBar()
  Protected info.s, x, y
  x = GetGadgetState(#MainTrackBarH)
  y = 10000 - GetGadgetState(#MainTrackBarV)
  With CanvasData
    \TrackPosX = x
    \TrackPosY = y
  EndWith
  DrawCanvas(CanvasData)
  info = " X = " + Str(x) + " / Y = " + Str(y)
  StatusBarText(#MainStatusBar, 0, info)
EndProcedure

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainCanvas, 10, 10, dx - 50, dy - 50)
  ResizeGadget(#MainTrackBarV, dx - 40, 10, 30, dy - 50)
  ResizeGadget(#MainTrackBarH, 10, dy - 40, dx - 50, 30)
  DrawCanvas(CanvasData)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
      MenuBar()
    CompilerEndIf
    
    MenuItem(#MainMenuExit, "E&xit")
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    
    CanvasGadget(#MainCanvas, 10, 10, dx - 50, dy - 50)
    
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      TrackBarGadget(#MainTrackBarH, 10, dy - 40, dx - 50, 30, 0, 10000, #TBS_TOP)
      TrackBarGadget(#MainTrackBarV, dx - 40, 10, 30, dy - 50, 0, 10000, #PB_TrackBar_Vertical | #TBS_LEFT)
      SendMessage_(GadgetID(#MainTrackBarH), #WM_UPDATEUISTATE, MAKEWPARAM(#UIS_SET, #UISF_HIDEFOCUS), 0)
      SendMessage_(GadgetID(#MainTrackBarV), #WM_UPDATEUISTATE, MAKEWPARAM(#UIS_SET, #UISF_HIDEFOCUS), 0)
    CompilerElse
      TrackBarGadget(#MainTrackBarH, 10, dy - 40, dx - 50, 30, 0, 10000)
      TrackBarGadget(#MainTrackBarV, dx - 40, 10, 30, dy - 50, 0, 10000, #PB_TrackBar_Vertical)
    CompilerEndIf
    
    SetGadgetState(#MainTrackBarH, 5000)
    SetGadgetState(#MainTrackBarV, 10000 - 5000)
    
    InitCanvas(#MainCanvas, CanvasData)
    DoEventTrackBar()
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    BindGadgetEvent(#MainTrackBarV, @DoEventTrackBar())
    BindGadgetEvent(#MainTrackBarH, @DoEventTrackBar())
    
    AddWindowTimer(#Main, 1, 1000)
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
              
          EndSelect
          
        Case #PB_Event_Timer
          Select EventTimer()
            Case 1
              ;Debug "Timer 1"
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()
Zuletzt geändert von mk-soft am 24.09.2022 16:01, insgesamt 5-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Wie baut man einen Thread richtig auf?

Beitrag von Re42 »

In meinem Post gestern hatte ich leider #TBS_LEFT gar nicht dazugeschrieben, blöd, aber gut, daß du es nun extra nochmal erklärt hast. Dank deines neuesten Codes weiß ich jetzt auch, daß man beim TrackBarGadget sogar den Fokus-Rahmen entfernen kann, du bist echt ein Profi, Danke :allright:
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie baut man einen Thread richtig auf?

Beitrag von mk-soft »

Update: Kleine CanvasGadget Spielerei hinzugefügt ... (TrackBar in Prozent mit zwei Komma-Stellen) :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten