TrafficMonitor — một công cụ mã nguồn mở giám sát hiệu suất hệ thống trên thanh tác vụ Windows — áp dụng mô hình kiến trúc plugin để tách biệt chức năng giám sát khỏi lõi ứng dụng. Mô hình này cho phép mở rộng linh hoạt mà không làm tăng độ phức tạp hay ảnh hưởng đến hiệu năng của phần mềm chính.
Nguyên lý thiết kế giao diện plugin
Hệ thống plugin dựa trên lớp trừu tượng C++ được định nghĩa trong PluginInterface.h. Hai giao diện cốt lõi đảm bảo tính tương thích và khả năng mở rộng:
class IMonitorElement {
public:
virtual const wchar_t* GetName() const = 0;
virtual const wchar_t* GetKey() const = 0;
virtual const wchar_t* GetLabel() const = 0;
virtual const wchar_t* GetValue() const = 0;
virtual const wchar_t* GetSample() const = 0;
virtual bool SupportsCustomRendering() const = 0;
virtual int PreferredWidth() const = 0;
virtual void Render(HDC hdc, int x, int y, int w, int h, bool isDark) = 0;
};
class IExtensionModule {
public:
virtual IMonitorElement* GetElement(size_t idx) = 0;
virtual const wchar_t* GetTooltip() = 0;
virtual void FetchData() = 0;
virtual DialogResult ShowConfigDialog(HWND parent) = 0;
virtual const wchar_t* GetMetadata(ModuleInfoField field) = 0;
};
Ứng dụng chính không phụ thuộc vào cài đặt cụ thể của plugin, mà chỉ tham chiếu tới các interface trên thông qua hàm xuất TMPluginGetInstance(), giúp đạt được nguyên tắc đảo ngược phụ thuộc (Dependency Inversion).
Cơ chế tương tác thời gian chạy
- Cập nhật dữ liệu định kỳ: Gọi
FetchData()theo chu kỳ cấu hình (mặc định 1–5 giây) - Tách biệt xử lý dữ liệu và hiển thị: Giá trị văn bản do
GetValue()trả về; giao diện tùy chỉnh được vẽ bởiRender() - Quản lý cấu hình riêng: Mỗi plugin cung cấp hộp thoại tùy chọn độc lập thông qua
ShowConfigDialog() - An toàn đa luồng: Plugin chịu trách nhiệm đồng bộ hóa truy cập dữ liệu chia sẻ giữa luồng nền và luồng UI
Cấu trúc dự án và quy trình xây dựng
Dự án plugin tuân thủ chuẩn phát triển DLL Windows với tổ chức thư mục rõ ràng:
traffic-monitor-plugins/
├── include/
│ └── PluginInterface.h
├── libs/
│ ├── JsonParser.cpp # Phân tích JSON nhẹ
│ └── ConfigManager.cpp # Đọc/ghi cấu hình INI
└── src/
├── MarketTicker/ # Plugin giá chứng khoán
├── SysHealth/ # Plugin sức khỏe phần cứng
└── SampleExtension/ # Mẫu khởi tạo plugin
Mỗi plugin phải:
- Liên kết với
libs/và bao gồmPluginInterface.h - Sử dụng Unicode và thư viện runtime tĩnh (
/MT) - Xuất hàm
TMPluginGetInstance()kiểuextern "C" - Nhúng tài nguyên (biểu tượng, chuỗi) vào section tài nguyên của DLL
Ví dụ: Plugin giám sát thị trường chứng khoán
Plugin MarketTicker minh họa cách tích hợp nhiều nguồn dữ liệu thời gian thực:
class MarketTicker final : public IExtensionModule {
private:
std::vector<StockQuote> quotes_;
mutable std::shared_mutex data_lock_;
std::chrono::steady_clock::time_point last_fetch_;
public:
void FetchData() override {
if (shouldSkipUpdate()) return;
auto raw = fetchFromApi(); // Gọi API không chặn UI
std::unique_lock lock(data_lock_);
parseAndStore(raw);
}
IMonitorElement* GetElement(size_t i) override {
return i < quotes_.size() ? "es_[i] : nullptr;
}
};
Hỗ trợ đa thị trường với chiến lược cập nhật thông minh:
| Mã thị trường | Nguồn dữ liệu | Tần suất (giao dịch) | Tần suất (nghỉ) |
|---|---|---|---|
| sh / sz | Sina Finance API | 30s | 5 phút |
| hkex | Tencent Finance API | 30s | 3 phút |
| nasdaq | Alpha Vantage REST | 60s | 10 phút |
Ví dụ: Plugin giám sát phần cứng
Plugin SysHealth sử dụng thư viện LibreHardwareMonitor để thu thập chỉ số phần cứng. Các chỉ số được đăng ký động:
void SysHealth::RegisterSensors() {
AddSensor(L"Nhiệt độ CPU", L"cpu-temp", []{ return readCpuTemp(); });
AddSensor(L"Tải GPU", L"gpu-load", []{ return readGpuLoad(); });
AddSensor(L"Dung lượng RAM", L"ram-used", []{ return readRamUsage(); });
}
Các tối ưu hiệu năng:
- Đọc đồng loạt nhiều cảm biến trong một lần gọi thư viện
- Điều chỉnh tần suất lấy mẫu theo loại thiết bị (ví dụ: nhiệt độ mỗi 2s, điện áp mỗi 10s)
- Tự động vô hiệu hóa cảm biến không khả dụng mà không gây crash
Triển khai và quản lý plugin
Plugin được đặt trong thư mục con plugins/ cùng cấp với TrafficMonitor.exe. Khi khởi động, ứng dụng quét và tải tất cả DLL hợp lệ. Thứ tự hiển thị được điều khiển bằng thuộc tính PRIORITY trong metadata.
Cấu hình plugin được lưu dưới dạng file INI trong thư mục plugins/config/:
// plugins/config/market.ini
[General]
RefreshInterval=30
AutoStart=true
[Markets]
Active=sh,sz,nasdaq
sh.SymbolList=600519,000858
nasdaq.SymbolList=AAPL,MSFT
Chẩn đoán và tối ưu hiệu năng
Các kỹ thuật hỗ trợ phát triển:
- Gắn debugger Visual Studio vào tiến trình
TrafficMonitor.exeđể debug plugin - Sử dụng
OutputDebugStringW()để ghi log vào DebugView - Phân tích hiệu năng bằng Windows Performance Analyzer (WPA) với trace ETW
- Thiết lập logging chi tiết qua tham số dòng lệnh:
--log-level=debug --log-file=plugin.log
Các tối ưu đã áp dụng:
| Yếu tố | Giải pháp | Kết quả đo |
|---|---|---|
| Bộ nhớ lúc khởi động | Tải tài nguyên theo nhu cầu (lazy load) | Giảm 28% RAM footprint |
| CPU lúc nhàn rỗi | Điều chỉnh tần suất cập nhật theo trạng thái hệ thống | Giảm 65% CPU usage |
| Băng thông mạng | Nén phản hồi JSON + cache cục bộ có TTL | Giảm 47% traffic |