KillPbDebug

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

KillPbDebug

Beitrag 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
Zuletzt geändert von Kiffi am 10.11.2005 11:04, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Antworten