mirror of
https://github.com/m1ngsama/tracker.git
synced 2025-12-24 10:51:43 +00:00
feat: Implement process monitoring module
- Create ProcessMonitor using sysinfo System - Define ProcessInfo struct for process data - Implement get_top_processes() to find high CPU processes - Calculate CPU and memory usage percentages - Sort processes by CPU usage (descending) - Implement get_process_count() for total process count - Add display_processes() for formatted console output - Replicate Python version's process monitoring functionality
This commit is contained in:
parent
0dd5ecc441
commit
32ecbd8aff
1 changed files with 72 additions and 0 deletions
72
src/process.rs
Normal file
72
src/process.rs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
use sysinfo::System;
|
||||
|
||||
pub struct ProcessMonitor {
|
||||
sys: System,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ProcessInfo {
|
||||
pub pid: u32,
|
||||
pub name: String,
|
||||
pub cpu_percent: f32,
|
||||
pub memory_percent: f32,
|
||||
}
|
||||
|
||||
impl ProcessMonitor {
|
||||
pub fn new() -> Self {
|
||||
ProcessMonitor {
|
||||
sys: System::new_all(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_top_processes(&mut self, limit: usize) -> Vec<ProcessInfo> {
|
||||
self.sys.refresh_all();
|
||||
|
||||
let mut processes: Vec<ProcessInfo> = self.sys.processes()
|
||||
.iter()
|
||||
.map(|(pid, process)| {
|
||||
let total_memory = self.sys.total_memory() as f32;
|
||||
let memory_percent = if total_memory > 0.0 {
|
||||
(process.memory() as f32 / total_memory) * 100.0
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
|
||||
ProcessInfo {
|
||||
pid: pid.as_u32(),
|
||||
name: process.name().to_string_lossy().to_string(),
|
||||
cpu_percent: process.cpu_usage(),
|
||||
memory_percent,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
processes.sort_by(|a, b| b.cpu_percent.partial_cmp(&a.cpu_percent).unwrap());
|
||||
processes.truncate(limit);
|
||||
processes
|
||||
}
|
||||
|
||||
pub fn get_process_count(&mut self) -> usize {
|
||||
self.sys.refresh_all();
|
||||
self.sys.processes().len()
|
||||
}
|
||||
|
||||
pub fn display_processes(&mut self, limit: usize) {
|
||||
println!("\nTop Processes by CPU Usage:");
|
||||
println!("{:<10}{:<30}{:<10}{:<10}", "PID", "Name", "CPU%", "Memory%");
|
||||
println!("{}", "-".repeat(60));
|
||||
|
||||
for proc in self.get_top_processes(limit) {
|
||||
println!("{:<10}{:<30}{:<10.2}{:<10.2}",
|
||||
proc.pid, proc.name, proc.cpu_percent, proc.memory_percent);
|
||||
}
|
||||
|
||||
println!("\nTotal Processes: {}", self.get_process_count());
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for ProcessMonitor {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue