调整了设备移除函数,现在不会异常崩溃了
This commit is contained in:
@@ -776,10 +776,12 @@ void ClientManager::remove_device(const std::string& device_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto& ctx = it->second;
|
auto& ctx = it->second;
|
||||||
it->second->shutdown = true;
|
ctx->shutdown = true;
|
||||||
|
|
||||||
// 确保所有定时器都停止
|
// 1. 先停止所有定时器,避免定时器回调干扰
|
||||||
ctx->stop_timers();
|
ctx->stop_timers();
|
||||||
|
|
||||||
|
// 2. 清空动作队列,防止新的操作被触发
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> state_lock(ctx->state_mutex_);
|
std::lock_guard<std::mutex> state_lock(ctx->state_mutex_);
|
||||||
std::queue<StateAction> empty;
|
std::queue<StateAction> empty;
|
||||||
@@ -787,10 +789,37 @@ void ClientManager::remove_device(const std::string& device_id) {
|
|||||||
ctx->current_state_ = DeviceState::IDLE;
|
ctx->current_state_ = DeviceState::IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关闭连接并移除
|
// 3. 关闭TCP客户端句柄(关键修改:确保只关闭一次且正确同步)
|
||||||
it->second->close_handles();
|
if (!uv_is_closing((uv_handle_t*)&ctx->client)) {
|
||||||
|
// 设置句柄数据为nullptr,避免关闭回调中访问已释放资源
|
||||||
|
ctx->client.data = nullptr;
|
||||||
|
uv_close((uv_handle_t*)&ctx->client, [](uv_handle_t* handle) {
|
||||||
|
// 回调中不再操作ClientContext,因为可能已被释放
|
||||||
|
std::cout << "TCP handle closed successfully\n";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 关闭定时器句柄(如果未关闭)
|
||||||
|
if (!uv_is_closing((uv_handle_t*)&ctx->timer)) {
|
||||||
|
ctx->timer.data = nullptr;
|
||||||
|
uv_close((uv_handle_t*)&ctx->timer, nullptr);
|
||||||
|
}
|
||||||
|
if (!uv_is_closing((uv_handle_t*)&ctx->reconnect_timer)) {
|
||||||
|
ctx->reconnect_timer.data = nullptr;
|
||||||
|
uv_close((uv_handle_t*)&ctx->reconnect_timer, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 从管理器中移除设备(关键修改:延迟到事件循环处理完关闭操作后再释放)
|
||||||
|
// 将智能指针转移到栈上,确保在本函数结束后才销毁
|
||||||
|
auto ctx_ptr = std::move(it->second);
|
||||||
clients_.erase(it);
|
clients_.erase(it);
|
||||||
std::cout << "[Device " << device_id << "] Removed successfully\n";
|
|
||||||
|
std::cout << "[Device " << device_id << "] Removal process initiated\n";
|
||||||
|
|
||||||
|
// 6. 强制事件循环处理一次关闭操作(非阻塞)
|
||||||
|
if (loop_) {
|
||||||
|
uv_run(loop_, UV_RUN_NOWAIT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientManager::stop_all() {
|
void ClientManager::stop_all() {
|
||||||
|
|||||||
@@ -154,26 +154,26 @@ void* client_manager_thread(void* arg) {
|
|||||||
printf("Started client connections\n");
|
printf("Started client connections\n");
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
/*std::vector<PointInfo> points1 = {
|
//std::vector<PointInfo> points1 = {
|
||||||
{"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0},
|
// {"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0},
|
||||||
{"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0}
|
// {"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0}
|
||||||
};
|
//};
|
||||||
std::vector<PointInfo> points2 = {
|
//std::vector<PointInfo> points2 = {
|
||||||
{"P003", "Main Voltage", "D002",1 ,1, 1, 1, 1,"0.38k",0},
|
// {"P003", "Main Voltage", "D002",1 ,1, 1, 1, 1,"0.38k",0},
|
||||||
{"P004", "Backup Voltage", "D002",2 ,1, 1, 1, 1,"0.38k",0}
|
// {"P004", "Backup Voltage", "D002",2 ,1, 1, 1, 1,"0.38k",0}
|
||||||
};*/
|
//};
|
||||||
//00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 00-B7-8D-01-71-09 00-B7-8D-01-88-7f
|
////00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 00-B7-8D-01-71-09 00-B7-8D-01-88-7f
|
||||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
//// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
||||||
/*std::vector<DeviceInfo> devices = {
|
//std::vector<DeviceInfo> devices = {
|
||||||
{
|
// {
|
||||||
"D001", "Primary Device", "Model-X", "00-B7-8D-01-88-7f",
|
// "D001", "Primary Device", "Model-X", "00-B7-8D-01-88-7f",
|
||||||
1, points1,true
|
// 1, points1,true
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"D002", "Primary Device1", "Model-X1", "00-B7-8D-01-71-09",
|
// "D002", "Primary Device1", "Model-X1", "00-B7-8D-01-71-09",
|
||||||
1, points2,true
|
// 1, points2,true
|
||||||
}
|
// }
|
||||||
};*/
|
//};
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
|
// <20><><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
|
||||||
//std::vector<DeviceInfo> test_devices = generate_test_devices(100);
|
//std::vector<DeviceInfo> test_devices = generate_test_devices(100);
|
||||||
@@ -408,23 +408,47 @@ int main(int argc ,char** argv) {//
|
|||||||
}
|
}
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//std::vector<PointInfo> points1 = {
|
||||||
|
// {"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0},
|
||||||
|
// {"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0}
|
||||||
|
//};
|
||||||
|
//std::vector<PointInfo> points2 = {
|
||||||
|
// {"P003", "Main Voltage", "D002",1 ,1, 1, 1, 1,"0.38k",0},
|
||||||
|
// {"P004", "Backup Voltage", "D002",2 ,1, 1, 1, 1,"0.38k",0}
|
||||||
|
//};
|
||||||
|
////00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 00-B7-8D-01-71-09 00-B7-8D-01-88-7f
|
||||||
|
//// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
||||||
|
//std::vector<DeviceInfo> devices = {
|
||||||
|
// {
|
||||||
|
// "D001", "Primary Device", "Model-X", "00-B7-8D-01-88-7f",
|
||||||
|
// 1, points1,true
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "D002", "Primary Device1", "Model-X1", "00-B7-8D-01-71-09",
|
||||||
|
// 1, points2,true
|
||||||
|
// }
|
||||||
|
//};
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>״̬
|
// <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>״̬
|
||||||
static int queue_monitor = 0;
|
static int queue_monitor = 0;
|
||||||
|
static bool flag = false;
|
||||||
//static int count = 3;
|
//static int count = 3;
|
||||||
if (++queue_monitor >= 20) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>豸
|
if (++queue_monitor >= 60) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>豸
|
||||||
printf("Message queue size: %zu\n", message_queue.size());
|
printf("Message queue size: %zu\n", message_queue.size());
|
||||||
queue_monitor = 0;
|
queue_monitor = 0;
|
||||||
|
/*if (flag) {
|
||||||
/*for (const auto& device : devices) {
|
flag = false;
|
||||||
//ClientManager::instance().add_device(device);
|
for (const auto& device : devices) {
|
||||||
}*/
|
ClientManager::instance().add_device(device);
|
||||||
|
}
|
||||||
/*std::vector<DeviceInfo> test_devices = generate_test_devices(count);
|
}
|
||||||
count++;
|
else {
|
||||||
|
flag = true;
|
||||||
for (const auto& device : test_devices) {
|
|
||||||
ClientManager::instance().remove_device("D001");
|
ClientManager::instance().remove_device("D001");
|
||||||
|
ClientManager::instance().remove_device("D002");
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user