Seite 1 von 2

Externes Programm in low priority starten?

Verfasst: 17.04.2008 13:17
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 :/

Verfasst: 17.04.2008 15:12
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()

Verfasst: 17.04.2008 15:20
von STARGÅTE
Das Ergebnis von RunProgram() ist nur das PB interne Handle, für das echte müsst du noch mit ProgramID() ermitteln.

Verfasst: 17.04.2008 15:22
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  

Verfasst: 17.04.2008 15:32
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) 

Verfasst: 17.04.2008 15:38
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...

Verfasst: 17.04.2008 17:05
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

Verfasst: 17.04.2008 17:42
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

Verfasst: 17.04.2008 18:51
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

Verfasst: 17.04.2008 18:55
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 :(