Seite 1 von 1

KillPbDebug

Verfasst: 10.11.2005 10:07
von Kiffi
Hallo,

es passiert mir schon mal des öfteren, dass sich ein Programm, das ich
gerade mit PB schreibe und im Debugger starte, nicht mehr reagiert oder
sich selbstständig macht. Dann heisst es: Taskmanager aufrufen und
mühsam mein Programm in der langen Liste der laufenden Tasks finden,
um es dann abzuschiessen.

Mit nachfolgendem Code wird's ein wenig einfacher. Hier werden nur die
Prozesse aufgelistet, deren Name mit 'PureBasic' anfangen. Somit können
wildgewordene PB-Programme nun schneller in's digitale Jenseits
geschickt werden.

Nix dolles, aber vielleicht für den einen oder anderen nützlich.

Wichtig: Der Code benötigt die Process-Lib aus dem PBOSL-Paket.

Code: Alles auswählen

; KillPBDebug
; 
; This code needs the Process-Library 
; from PBOSL (http://pbosl.purearea.net/)

Enumeration
  #frmMain
  #Processes
  #cmdKillProcess
  #myTimer
EndEnumeration

Procedure UpdateProcessList()
  EndTimer(#myTimer)
  SelectedItem = GetGadgetState(#Processes)
  ClearGadgetItemList(#Processes)
  ProcessCount = ExamineProcesses()
  For lCounter = 1 To ProcessCount
    NextProcess()
    sProcessName.s = GetProcessName()
    If FindString(sProcessName, "PureBasic", 1)
      If sProcessName <> "PureBasic.exe"
        AddGadgetItem(#Processes, -1, sProcessName)
      EndIf
    EndIf
  Next ; lCounter
  If SelectedItem > - 1
    If SelectedItem > CountGadgetItems(#Processes)
      SelectedItem = CountGadgetItems(#Processes)
    EndIf
    SetGadgetState(#Processes, SelectedItem)
  EndIf
  StartTimer(#myTimer, 1000, @UpdateProcessList())
EndProcedure

If OpenWindow(#frmMain, 0, 0, 150, 185, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "KillPbDebug")
  
  If CreateGadgetList(WindowID(#frmMain))
    
    ListViewGadget(#Processes, 5, 5, 140, 150)
    ButtonGadget(#cmdKillProcess, 5, 160, 140, 20, "&Kill process")
    
    UpdateProcessList()
    
    StartTimer(#myTimer, 1000, @UpdateProcessList())
    
    Repeat
      
      WaitWindowEvent = WaitWindowEvent()
      EventGadgetID   = EventGadgetID()
      
      Select WaitWindowEvent
        
        Case #PB_Event_Gadget
          
          Select EventGadgetID
            
            Case #cmdKillProcess
              PID=GetProcessPID(GetGadgetText(#Processes))
              If PID : KillPID(PID,0) : EndIf
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Quit = 1
          
      EndSelect
      
    Until Quit = 1
    
  EndIf
  
EndIf
// Edit: Verbesserungsvorschlag von Thomas (siehe unten) eingebaut

Verfasst: 10.11.2005 10:51
von ts-soft
Danke Kiffi, hab einen kleiner Verbesserungsvorschlag, damit man seine IDE (PureBasic.exe) nicht ausversehen abschießt :mrgreen:

Code: Alles auswählen

Procedure UpdateProcessList()
  EndTimer(#myTimer)
  SelectedItem = GetGadgetState(#Processes)
  ClearGadgetItemList(#Processes)
  ProcessCount = ExamineProcesses()
  For lCounter = 1 To ProcessCount
    NextProcess()
    sProcessName.s = GetProcessName()
    If FindString(sProcessName, "PureBasic", 1)
      If sProcessName <> "PureBasic.exe"
        AddGadgetItem(#Processes, -1, sProcessName)
      EndIf
    EndIf
  Next ; lCounter
  If SelectedItem > - 1
    If SelectedItem > CountGadgetItems(#Processes)
      SelectedItem = CountGadgetItems(#Processes)
    EndIf
    SetGadgetState(#Processes, SelectedItem)
  EndIf
  StartTimer(#myTimer, 1000, @UpdateProcessList())
EndProcedure
Es reicht, die If abfrage einzufügen, oder der Einfachheit halber die Procedure austauschen.

Ich nehme mal an, wer jaPBe verwendet, braucht die Änderung nicht :wink:

Verfasst: 10.11.2005 11:03
von Kiffi
> Danke Kiffi, hab einen kleiner Verbesserungsvorschlag, damit man seine
> IDE (PureBasic.exe) nicht ausversehen abschießt :mrgreen:

Huppsa! ;-)

Du hast recht: Ich arbeite mit jaPBe. Aus diesem Grund ist mir das nicht
aufgefallen. Danke für den Hinweis! Deine Änderungen sind in den
Ursprungscode eingeflossen.

Grüße ... Kiffi