mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-18 13:04:37 +03:00
chore: optimize traffic looper
This commit is contained in:
@@ -8,12 +8,12 @@
|
|||||||
namespace NekoRay::traffic {
|
namespace NekoRay::traffic {
|
||||||
|
|
||||||
TrafficLooper *trafficLooper = new TrafficLooper;
|
TrafficLooper *trafficLooper = new TrafficLooper;
|
||||||
QElapsedTimer trafficLooper_timer;
|
QElapsedTimer elapsedTimer;
|
||||||
|
|
||||||
std::unique_ptr<TrafficData> TrafficLooper::update_stats(TrafficData *item) {
|
TrafficData *TrafficLooper::update_stats(TrafficData *item) {
|
||||||
#ifndef NKR_NO_GRPC
|
#ifndef NKR_NO_GRPC
|
||||||
// last update
|
// last update
|
||||||
auto now = trafficLooper_timer.elapsed();
|
auto now = elapsedTimer.elapsed();
|
||||||
auto interval = now - item->last_update;
|
auto interval = now - item->last_update;
|
||||||
item->last_update = now;
|
item->last_update = now;
|
||||||
if (interval <= 0) return nullptr;
|
if (interval <= 0) return nullptr;
|
||||||
@@ -29,7 +29,7 @@ namespace NekoRay::traffic {
|
|||||||
item->uplink_rate = uplink * 1000 / interval;
|
item->uplink_rate = uplink * 1000 / interval;
|
||||||
|
|
||||||
// return diff
|
// return diff
|
||||||
auto ret = std::make_unique<TrafficData>(item->tag);
|
auto ret = new TrafficData(item->tag);
|
||||||
ret->downlink = downlink;
|
ret->downlink = downlink;
|
||||||
ret->uplink = uplink;
|
ret->uplink = uplink;
|
||||||
ret->downlink_rate = item->downlink_rate;
|
ret->downlink_rate = item->downlink_rate;
|
||||||
@@ -49,15 +49,15 @@ namespace NekoRay::traffic {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficLooper::update_all() {
|
void TrafficLooper::UpdateAll() {
|
||||||
std::map<std::string, std::unique_ptr<TrafficData>> updated; // tag to diff
|
std::map<std::string, TrafficData *> updated; // tag to diff
|
||||||
for (const auto &item: items) {
|
for (const auto &item: this->items) {
|
||||||
auto data = item.get();
|
auto data = item.get();
|
||||||
auto diff = std::move(updated[data->tag]);
|
auto diff = updated[data->tag];
|
||||||
// 避免重复查询一个 outbound tag
|
// 避免重复查询一个 outbound tag
|
||||||
if (diff == nullptr) {
|
if (diff == nullptr) {
|
||||||
diff = update_stats(data);
|
diff = update_stats(data);
|
||||||
updated[data->tag] = std::move(diff);
|
updated[data->tag] = diff;
|
||||||
} else {
|
} else {
|
||||||
data->uplink += diff->uplink;
|
data->uplink += diff->uplink;
|
||||||
data->downlink += diff->downlink;
|
data->downlink += diff->downlink;
|
||||||
@@ -65,11 +65,15 @@ namespace NekoRay::traffic {
|
|||||||
data->downlink_rate = diff->downlink_rate;
|
data->downlink_rate = diff->downlink_rate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
update_stats(bypass);
|
updated[bypass->tag] = update_stats(bypass);
|
||||||
|
//
|
||||||
|
for (const auto &pair: updated) {
|
||||||
|
delete pair.second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrafficLooper::loop() {
|
void TrafficLooper::Loop() {
|
||||||
trafficLooper_timer.start();
|
elapsedTimer.start();
|
||||||
while (true) {
|
while (true) {
|
||||||
auto sleep_ms = dataStore->traffic_loop_interval;
|
auto sleep_ms = dataStore->traffic_loop_interval;
|
||||||
auto user_disabled = sleep_ms == 0;
|
auto user_disabled = sleep_ms == 0;
|
||||||
@@ -97,7 +101,7 @@ namespace NekoRay::traffic {
|
|||||||
// do update
|
// do update
|
||||||
loop_mutex.lock();
|
loop_mutex.lock();
|
||||||
|
|
||||||
update_all();
|
UpdateAll();
|
||||||
|
|
||||||
// do conn list update
|
// do conn list update
|
||||||
QJsonArray conn_list;
|
QJsonArray conn_list;
|
||||||
|
|||||||
@@ -15,16 +15,18 @@ namespace NekoRay::traffic {
|
|||||||
QMutex loop_mutex;
|
QMutex loop_mutex;
|
||||||
|
|
||||||
QList<QSharedPointer<TrafficData>> items;
|
QList<QSharedPointer<TrafficData>> items;
|
||||||
TrafficData *bypass = new TrafficData("bypass");
|
|
||||||
TrafficData *proxy = nullptr;
|
TrafficData *proxy = nullptr;
|
||||||
|
|
||||||
static std::unique_ptr<TrafficData> update_stats(TrafficData *item);
|
void UpdateAll();
|
||||||
|
|
||||||
static QJsonArray get_connection_list();
|
void Loop();
|
||||||
|
|
||||||
void update_all();
|
private:
|
||||||
|
TrafficData *bypass = new TrafficData("bypass");
|
||||||
|
|
||||||
void loop();
|
[[nodiscard]] static TrafficData *update_stats(TrafficData *item);
|
||||||
|
|
||||||
|
[[nodiscard]] static QJsonArray get_connection_list();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern TrafficLooper *trafficLooper;
|
extern TrafficLooper *trafficLooper;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ void MainWindow::setup_grpc() {
|
|||||||
runOnUiThread([=] { t->start(2000); }, t);
|
runOnUiThread([=] { t->start(2000); }, t);
|
||||||
|
|
||||||
// Looper
|
// Looper
|
||||||
runOnNewThread([=] { NekoRay::traffic::trafficLooper->loop(); });
|
runOnNewThread([=] { NekoRay::traffic::trafficLooper->Loop(); });
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,7 +271,7 @@ void MainWindow::neko_stop(bool crash) {
|
|||||||
NekoRay::traffic::trafficLooper->loop_enabled = false;
|
NekoRay::traffic::trafficLooper->loop_enabled = false;
|
||||||
NekoRay::traffic::trafficLooper->loop_mutex.lock();
|
NekoRay::traffic::trafficLooper->loop_mutex.lock();
|
||||||
if (NekoRay::dataStore->traffic_loop_interval != 0) {
|
if (NekoRay::dataStore->traffic_loop_interval != 0) {
|
||||||
NekoRay::traffic::trafficLooper->update_all();
|
NekoRay::traffic::trafficLooper->UpdateAll();
|
||||||
for (const auto &item: NekoRay::traffic::trafficLooper->items) {
|
for (const auto &item: NekoRay::traffic::trafficLooper->items) {
|
||||||
NekoRay::profileManager->GetProfile(item->id)->Save();
|
NekoRay::profileManager->GetProfile(item->id)->Save();
|
||||||
refresh_proxy_list(item->id);
|
refresh_proxy_list(item->id);
|
||||||
|
|||||||
Reference in New Issue
Block a user