@@ -98,6 +98,7 @@ NetManagerThreadPrivate::NetManagerThreadPrivate()
9898 , m_netCheckAvailable(false )
9999 , m_isSleeping(false )
100100 , m_showPageTimer(nullptr )
101+ , m_vpnStateUpdateTimer(nullptr )
101102 , m_supportWireless(false )
102103{
103104 moveToThread (m_thread);
@@ -106,12 +107,15 @@ NetManagerThreadPrivate::NetManagerThreadPrivate()
106107
107108NetManagerThreadPrivate::~NetManagerThreadPrivate ()
108109{
110+ // 先断开所有信号,防止析构期间再有新任务(如singleShot)入队
111+ disconnect ();
109112 m_thread->quit ();
110- m_thread->wait (QDeadlineTimer (200 ));
113+ // 增大等待时间至1000ms,避免50ms定时器回调等正在执行的任务被terminate强杀
114+ m_thread->wait (QDeadlineTimer (1000 ));
111115 if (m_thread->isRunning ()) {
112116 m_thread->terminate ();
113117 }
114- m_thread->wait (QDeadlineTimer (200 ));
118+ m_thread->wait (QDeadlineTimer (500 ));
115119 delete m_thread;
116120}
117121
@@ -416,6 +420,9 @@ void NetManagerThreadPrivate::doInit()
416420 }
417421 Q_EMIT itemAdded (" Root" , vpnControlItem);
418422
423+ m_vpnStateUpdateTimer = new QTimer (this );
424+ m_vpnStateUpdateTimer->setSingleShot (true );
425+ m_vpnStateUpdateTimer->setInterval (55 );
419426 auto updateVPNConnectionState = [this ]() {
420427 auto itemList = NetworkController::instance ()->vpnController ()->items ();
421428 NetType::NetDeviceStatus state = NetType::DS_Disconnected;
@@ -431,8 +438,10 @@ void NetManagerThreadPrivate::doInit()
431438 }
432439 Q_EMIT dataChanged (DataChanged::VPNConnectionStateChanged, " NetVPNControlItem" , QVariant::fromValue (state));
433440 };
434- auto vpnConnectionStateChanged = [this , updateVPNConnectionState] {
435- QTimer::singleShot (50 , this , updateVPNConnectionState);
441+ connect (m_vpnStateUpdateTimer, &QTimer::timeout, this , updateVPNConnectionState);
442+ auto vpnConnectionStateChanged = [this ] {
443+ // 使用成员定时器,重复触发时自动重置计时,防止多次触发累积
444+ m_vpnStateUpdateTimer->start ();
436445 };
437446
438447 auto vpnItemChanged = [this , vpnConnectionStateChanged] {
@@ -596,6 +605,11 @@ void NetManagerThreadPrivate::clearData()
596605 delete m_autoScanTimer;
597606 m_autoScanTimer = nullptr ;
598607 }
608+ if (m_vpnStateUpdateTimer) {
609+ m_vpnStateUpdateTimer->stop ();
610+ delete m_vpnStateUpdateTimer;
611+ m_vpnStateUpdateTimer = nullptr ;
612+ }
599613 if (m_secretAgent) {
600614 delete m_secretAgent;
601615 m_secretAgent = nullptr ;
0 commit comments