Externes Programm in low priority starten?

Anfängerfragen zum Programmieren mit PureBasic.
icecrusher
Beiträge: 62
Registriert: 01.03.2008 05:43
Wohnort: Hamm
Kontaktdaten:

Externes Programm in low priority starten?

Beitrag von icecrusher »

Hi, habe mir nen kleines Tool für Steam gebaut mit welchem ich Steam in Standard un Niedrige Priorität Starten können soll^^

Habe mir dazu, da jeder User Steam auf ein andere verzeichnis installiert hat, das Verzeichniss + exe aus der Registry abgerufen und in path$ gesaved.

das funktioniert auch wenn ich

Code: Alles auswählen

RunProgram(path$)
benutze,
jetzt das problem: ich möchte wie oben beschrieben, dass das Programm in Low Priority Startet, wie funktioniert das?

Danke für eure hilfe ;)

Hier der Code

Code: Alles auswählen

;{- File Includes
IncludeFile "E:\registry.pbi"
;}

;{- Enumerations / DataSections
;{ Windows
Global Window_0
;}
;{ Gadgets
Global Frame3D_0
Global Text_1
Global Button_2
Global Button_3
Global Frame3D_4
Global Button_7
Global Text_8
;}
;}
Procedure OpenWindow_Window_0()
  Window_0 = OpenWindow(#PB_Any, 476, 488, 370, 123, "SteamStarter v1.0", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
  If Window_0
    If CreateGadgetList(WindowID(Window_0))
      Frame3D_0 = Frame3DGadget(#PB_Any, 5, 0, 360, 55, "Info")
      Text_1 = TextGadget(#PB_Any, 10, 15, 350, 30, "This Tool is starting Steam in Low priority Mode, you can choose between Low priority and Normal priority.")
      Button_2 = ButtonGadget(#PB_Any, 5, 60, 170, 25, "Start Steam in Low priority", #PB_Button_Default)
      Button_3 = ButtonGadget(#PB_Any, 195, 60, 170, 25, "Start Steam in Normal priority")
      Frame3D_4 = Frame3DGadget(#PB_Any, -15, 90, 465, 60, "")
      Button_7 = ButtonGadget(#PB_Any, 280, 100, 85, 20, "Close")
      Text_8 = TextGadget(#PB_Any, 5, 103, 270, 15, "Made by Icecrusher aka. Oxigen")
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()


;{- Event loop
Repeat
  Select WaitWindowEvent()
    ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_2 ;LowPriority
        path$ = Reg_GetValue(#HKEY_CURRENT_USER, "Software\Valve\Steam", "SteamExe")
        RunProgram(path$)
        Case Button_3 ;NormalPriority
        path$ = Reg_GetValue(#HKEY_CURRENT_USER, "Software\Valve\Steam", "SteamExe")
        RunProgram(path$)
        Case Button_7
        EXIT = 1

      EndSelect
    ; ////////////////////////
        Case #PB_Event_CloseWindow
         EventWindow = EventWindow()
          If EventWindow = Window_0
            EXIT = 1
          EndIf
        EndSelect
     Until EXIT
   CloseWindow(Window_0)
 End
;
;}
-edit-
würde gern auch, dass das Programm auf x64 OS funktioniert, weis aber nicht genau wie dort die Registry Pfade sind, und wie ich das Tool überprüfen lasse, ob es ein x86 oder x64bit os ist :/
Riacon
Beiträge: 61
Registriert: 21.01.2008 09:40

Beitrag von Riacon »

SetPriorityClass_(hProcess,IDLE_PRIORITY_CLASS)

damit könnte es gehen.
hProcess ist das handle des programms. ich weiß jetzt nicht wo man das herbekommt. ev. ist das der rückgabewert von runprogram()
pb 4.51 win7 64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Das Ergebnis von RunProgram() ist nur das PB interne Handle, für das echte müsst du noch mit ProgramID() ermitteln.
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
icecrusher
Beiträge: 62
Registriert: 01.03.2008 05:43
Wohnort: Hamm
Kontaktdaten:

Beitrag von icecrusher »

öhhm dies bedeutet nun für mich?

Finde in der help das SetPriorityClass nicht..

Verwenden "würde ich"

Code: Alles auswählen

Procedure steam()
  
  path$ = Reg_GetValue(#HKEY_CURRENT_USER, "Software\Valve\Steam", "SteamExe")
  RunProgram(path$)
EndProcedure

OpenWindow_init_Window_0()
  For i=0 To 130
  SetGadgetState(init_ProgressBar_0,i)
  Delay(30)
  Next
  steam()
  
  pid$ = ProgramID(Steam.exe)
  SetPriorityClass_(pid$,IDLE_PRIORITY_CLASS) 
EXIT = 1  
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

SetPriorityClass ist eine WIN-API funktion und nicht von PB

Du musst dann die Priorität so festlegen:

Code: Alles auswählen

MeinProgramm = RunProgram(path$)
SetPriorityClass_(ProgramID(MeinProgramm), #IDLE_PRIORITY_CLASS) 
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
icecrusher
Beiträge: 62
Registriert: 01.03.2008 05:43
Wohnort: Hamm
Kontaktdaten:

Beitrag von icecrusher »

STARGÅTE hat geschrieben:SetPriorityClass ist eine WIN-API funktion und nicht von PB

Du musst dann die Priorität so festlegen:

Code: Alles auswählen

MeinProgramm = RunProgram(path$)
SetPriorityClass_(ProgramID(MeinProgramm), #IDLE_PRIORITY_CLASS) 
Wenn ich das so richtig sehe, müsste er doch das Programm 2x starten oder?

-edit-

Ist die Konstante am ende jetzt für Niedrige priorität oder Standard?

Ich erhalte nun folgenden fehler:
Klick Mich ich bin ein Screenshot :)

Wenn ich jedoch die SetPid() auskommentiere, dann stürzt er mir nicht ab.

Code: Alles auswählen

;{- File Includes
IncludeFile "E:\registry.pbi"
;}

;{- Enumerations / DataSections
;{ Windows
Global init_Window_0
;}
;{ Gadgets
Global init_ProgressBar_0
Global init_Text_1
;}
;}

Procedure OpenWindow_init_Window_0()
  init_Window_0 = OpenWindow(#PB_Any, 536, 532, 245, 38, "Initializing Steam.exe", #PB_Window_WindowCentered|#PB_Window_ScreenCentered|#PB_Window_TitleBar|#PB_Window_SystemMenu)
  If init_Window_0
    If CreateGadgetList(WindowID(init_Window_0))
      init_ProgressBar_0 = ProgressBarGadget(#PB_Any, 5, 20, 235, 15, 0, 100)
      init_Text_1 = TextGadget(#PB_Any, 5, 3, 230, 15, "Initializing Steam.exe Please Wait...", #PB_Text_Center)
  EndIf
EndIf

EndProcedure

Procedure steam()
  
  path$ = Reg_GetValue(#HKEY_CURRENT_USER, "Software\Valve\Steam", "SteamExe")
  RunProgram(path$)
EndProcedure
Procedure SetPid()

  pid = RunProgram(path$)
  SetPriorityClass_(ProgramID(pid), #IDLE_PRIORITY_CLASS)  
EndProcedure

OpenWindow_init_Window_0()
  For i=0 To 130
  SetGadgetState(init_ProgressBar_0,i)
  Delay(30)
  Next
  steam()
  SetPid()
EXIT = 1  
;{- Event loop
Repeat
  Select WaitWindowEvent()
    ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case init_ProgressBar_0
        Case init_Text_1
      EndSelect
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = Window_0
            EXIT = 1
      EndIf
      EndSelect
     Until EXIT
          CloseWindow(init_Window_0)
    End
;
;}
End
Das ist der Launcher des Steamstarters, er wird nun per Klick aufm Button ausgeführt, und soll die steam.exe ausführen, und ihr eine Niedrige Priorität zuweisen...
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

hi icecrusher,

probier es doch mal so:

Code: Alles auswählen

Procedure steam() 
  Path$ = Reg_GetValue(#HKEY_CURRENT_USER, "Software\Valve\Steam", "SteamExe")
  pid = RunProgram(Path$)
  SetPriorityClass_(ProgramID(pid), #IDLE_PRIORITY_CLASS) 
EndProcedure
SetPid() kannst dann weglassen ;)
es gibt diese vier stufen für die priorität mit SetPriorityClass():

Code: Alles auswählen

#IDLE_PRIORITY_CLASS
#NORMAL_PRIORITY_CLASS
#HIGH_PRIORITY_CLASS
#REALTIME_PRIORITY_CLASS
mfG
tobe
PureBasic 4.40 (Windows - x86)
icecrusher
Beiträge: 62
Registriert: 01.03.2008 05:43
Wohnort: Hamm
Kontaktdaten:

Beitrag von icecrusher »

Hmm, er sagt mir im debugger: Program is not an open Program object

Kann es sein, dass diese API nicht auf Vista läuft?

-edit-
IM:

SetPriorityClass_(ProgramID(pid), #IDLE_PRIORITY_CLASS)

Fehlen die "" -.-
SetPriorityClass_("ProgramID(pid)", #IDLE_PRIORITY_CLASS)
währe demnach nun richtig, dennoch hat der prozess eine "normale" Priorität
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

versuch mal mit

Code: Alles auswählen

RunProgram(Programname.s,"","",'PB_Program_Open)
ohne Parameter liefert Runprogram nicht s anständiges zurück
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
icecrusher
Beiträge: 62
Registriert: 01.03.2008 05:43
Wohnort: Hamm
Kontaktdaten:

Beitrag von icecrusher »

bobobo hat geschrieben:versuch mal mit

Code: Alles auswählen

RunProgram(Programname.s,"","",'PB_Program_Open)
ohne Parameter liefert Runprogram nicht s anständiges zurück
Bringt nichts, trotzdem keine änderung der Priorität :(
Antworten