将接口调用改为线程执行,防止超时阻塞数据/状态控制线程
This commit is contained in:
@@ -47,6 +47,14 @@ std::vector<terminal_dev> terminal_devlist;
|
|||||||
//台账锁
|
//台账锁
|
||||||
std::mutex ledgermtx;
|
std::mutex ledgermtx;
|
||||||
|
|
||||||
|
///////////////////////////////////异步接口队列
|
||||||
|
std::mutex g_qvvr_async_mtx;
|
||||||
|
|
||||||
|
std::list<QvvrFileDownloadTask> g_qvvr_file_download_list;
|
||||||
|
|
||||||
|
std::list<QvvrJsonTask> g_qvvr_json_list;
|
||||||
|
///////////////////////////////////
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
extern int g_front_seg_num;
|
extern int g_front_seg_num;
|
||||||
@@ -1699,3 +1707,148 @@ bool get_monitor_name_by_monitor_id(const std::string& monitor_id,
|
|||||||
out_monitor_name.clear();
|
out_monitor_name.clear();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////异步接口
|
||||||
|
// ★新增:代替直接调用 update_qvvr_file_download()
|
||||||
|
void enqueue_qvvr_file_download(const std::string& file_path,
|
||||||
|
const std::string& terminal_id)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lk(g_qvvr_async_mtx);
|
||||||
|
|
||||||
|
QvvrFileDownloadTask task;
|
||||||
|
task.file_path = file_path;
|
||||||
|
task.terminal_id = terminal_id;
|
||||||
|
|
||||||
|
g_qvvr_file_download_list.push_back(task);
|
||||||
|
|
||||||
|
std::cout << "[QVVR_ASYNC] enqueue file_download terminal="
|
||||||
|
<< terminal_id
|
||||||
|
<< " file=" << file_path
|
||||||
|
<< " size=" << g_qvvr_file_download_list.size()
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ★新增:代替直接调用 transfer_json_qvvr_data()
|
||||||
|
void enqueue_qvvr_json_update(const std::string& terminal_id,
|
||||||
|
int line_id,
|
||||||
|
double amplitude,
|
||||||
|
double persist_time,
|
||||||
|
long long trigger_time_ms,
|
||||||
|
int type,
|
||||||
|
int phase,
|
||||||
|
const std::string& wavepath)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lk(g_qvvr_async_mtx);
|
||||||
|
|
||||||
|
QvvrJsonTask task;
|
||||||
|
task.terminal_id = terminal_id;
|
||||||
|
task.line_id = line_id;
|
||||||
|
task.amplitude = amplitude;
|
||||||
|
task.persist_time = persist_time;
|
||||||
|
task.trigger_time_ms = trigger_time_ms;
|
||||||
|
task.type = type;
|
||||||
|
task.phase = phase;
|
||||||
|
task.wavepath = wavepath;
|
||||||
|
|
||||||
|
g_qvvr_json_list.push_back(task);
|
||||||
|
|
||||||
|
std::cout << "[QVVR_ASYNC] enqueue json terminal="
|
||||||
|
<< terminal_id
|
||||||
|
<< " line=" << line_id
|
||||||
|
<< " time=" << trigger_time_ms
|
||||||
|
<< " size=" << g_qvvr_json_list.size()
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ★新增:FrontThread 中调用,消费异步接口任务
|
||||||
|
void process_qvvr_async_tasks()
|
||||||
|
{
|
||||||
|
// 每轮最多处理几个,避免一个接口卡住太久
|
||||||
|
const int MAX_FILE_TASK_PER_ROUND = 1;
|
||||||
|
const int MAX_JSON_TASK_PER_ROUND = 3;
|
||||||
|
|
||||||
|
// 1. 处理 update_qvvr_file_download 队列
|
||||||
|
for (int n = 0; n < MAX_FILE_TASK_PER_ROUND; ++n) {
|
||||||
|
QvvrFileDownloadTask task;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lk(g_qvvr_async_mtx);
|
||||||
|
if (g_qvvr_file_download_list.empty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
task = g_qvvr_file_download_list.front();
|
||||||
|
g_qvvr_file_download_list.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << "[QVVR_ASYNC] call update_qvvr_file_download terminal="
|
||||||
|
<< task.terminal_id
|
||||||
|
<< " file=" << task.file_path
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
update_qvvr_file_download(task.file_path, task.terminal_id);
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
std::cerr << "[QVVR_ASYNC][ERROR] update_qvvr_file_download exception: "
|
||||||
|
<< e.what()
|
||||||
|
<< " terminal=" << task.terminal_id
|
||||||
|
<< " file=" << task.file_path
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
std::cerr << "[QVVR_ASYNC][ERROR] update_qvvr_file_download unknown exception"
|
||||||
|
<< " terminal=" << task.terminal_id
|
||||||
|
<< " file=" << task.file_path
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 处理 transfer_json_qvvr_data 队列
|
||||||
|
for (int n = 0; n < MAX_JSON_TASK_PER_ROUND; ++n) {
|
||||||
|
QvvrJsonTask task;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lk(g_qvvr_async_mtx);
|
||||||
|
if (g_qvvr_json_list.empty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
task = g_qvvr_json_list.front();
|
||||||
|
g_qvvr_json_list.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::cout << "[QVVR_ASYNC] call transfer_json_qvvr_data terminal="
|
||||||
|
<< task.terminal_id
|
||||||
|
<< " line=" << task.line_id
|
||||||
|
<< " time=" << task.trigger_time_ms
|
||||||
|
<< " wavepath=" << task.wavepath
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
transfer_json_qvvr_data(task.terminal_id,
|
||||||
|
task.line_id,
|
||||||
|
task.amplitude,
|
||||||
|
task.persist_time,
|
||||||
|
task.trigger_time_ms,
|
||||||
|
task.type,
|
||||||
|
task.phase,
|
||||||
|
task.wavepath);
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
std::cerr << "[QVVR_ASYNC][ERROR] transfer_json_qvvr_data exception: "
|
||||||
|
<< e.what()
|
||||||
|
<< " terminal=" << task.terminal_id
|
||||||
|
<< " line=" << task.line_id
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
std::cerr << "[QVVR_ASYNC][ERROR] transfer_json_qvvr_data unknown exception"
|
||||||
|
<< " terminal=" << task.terminal_id
|
||||||
|
<< " line=" << task.line_id
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,6 +32,44 @@ class Front;
|
|||||||
#define RECALL_HIS_DATA_BASE_NODE_ID 600
|
#define RECALL_HIS_DATA_BASE_NODE_ID 600
|
||||||
#define RECALL_ALL_DATA_BASE_NODE_ID 700*/
|
#define RECALL_ALL_DATA_BASE_NODE_ID 700*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////异步接口
|
||||||
|
struct QvvrFileDownloadTask {
|
||||||
|
std::string file_path;
|
||||||
|
std::string terminal_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct QvvrJsonTask {
|
||||||
|
std::string terminal_id;
|
||||||
|
int line_id;
|
||||||
|
double amplitude;
|
||||||
|
double persist_time;
|
||||||
|
long long trigger_time_ms;
|
||||||
|
int type;
|
||||||
|
int phase;
|
||||||
|
std::string wavepath;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ★声明
|
||||||
|
extern std::mutex g_qvvr_async_mtx;
|
||||||
|
|
||||||
|
extern std::list<QvvrFileDownloadTask> g_qvvr_file_download_list;
|
||||||
|
|
||||||
|
extern std::list<QvvrJsonTask> g_qvvr_json_list;
|
||||||
|
|
||||||
|
extern void process_qvvr_async_tasks();
|
||||||
|
|
||||||
|
extern void enqueue_qvvr_file_download(const std::string& file_path,
|
||||||
|
const std::string& terminal_id);
|
||||||
|
|
||||||
|
extern void enqueue_qvvr_json_update(const std::string& terminal_id,
|
||||||
|
int line_id,
|
||||||
|
double amplitude,
|
||||||
|
double persist_time,
|
||||||
|
long long trigger_time_ms,
|
||||||
|
int type,
|
||||||
|
int phase,
|
||||||
|
const std::string& wavepath);
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//单条补招时间结构
|
//单条补招时间结构
|
||||||
|
|||||||
@@ -473,6 +473,9 @@ void Front::FrontThread() {
|
|||||||
|
|
||||||
check_recall_event(); // 处理补招事件,从list中读取然后直接调用接口,每一条可能都不同测点,每个测点自己做好记录
|
check_recall_event(); // 处理补招事件,从list中读取然后直接调用接口,每一条可能都不同测点,每个测点自己做好记录
|
||||||
check_recall_file(); //处理补招文件-稳态和暂态
|
check_recall_file(); //处理补招文件-稳态和暂态
|
||||||
|
|
||||||
|
// ★新增:异步处理 QVVR 接口任务
|
||||||
|
process_qvvr_async_tasks();
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -353,9 +353,10 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
if(record.nType != 0){
|
if(record.nType != 0){
|
||||||
append_qvvr_event(id,event.head.name,
|
append_qvvr_event(id,event.head.name,
|
||||||
record.nType,record.fPersisstime,record.fMagntitude,record.triggerTimeMs,record.phase);
|
record.nType,record.fPersisstime,record.fMagntitude,record.triggerTimeMs,record.phase);
|
||||||
transfer_json_qvvr_data(id,event.head.name,
|
/*transfer_json_qvvr_data(id,event.head.name,
|
||||||
record.fMagntitude,record.fPersisstime,record.triggerTimeMs,record.nType,record.phase,
|
record.fMagntitude,record.fPersisstime,record.triggerTimeMs,record.nType,record.phase,
|
||||||
"");
|
"");*/
|
||||||
|
enqueue_qvvr_json_update(id, event.head.name, record.fMagntitude, record.fPersisstime, record.triggerTimeMs, record.nType, record.phase, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
//事件主动上送处理完成,不需要通知状态机
|
//事件主动上送处理完成,不需要通知状态机
|
||||||
@@ -848,7 +849,8 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
std::cout << "File saved: " << file_path << std::endl;
|
std::cout << "File saved: " << file_path << std::endl;
|
||||||
|
|
||||||
//lnk20250805文件保存成功调用录波文件上送接口
|
//lnk20250805文件保存成功调用录波文件上送接口
|
||||||
update_qvvr_file_download(file_path, id);
|
//update_qvvr_file_download(file_path, id);
|
||||||
|
enqueue_qvvr_file_download(file_path, id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cerr << "Failed to save file: " << file_path
|
std::cerr << "Failed to save file: " << file_path
|
||||||
@@ -2461,8 +2463,9 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
record.nType,record.fPersisstime,record.fMagntitude,record.triggerTimeMs,record.phase);
|
record.nType,record.fPersisstime,record.fMagntitude,record.triggerTimeMs,record.phase);
|
||||||
|
|
||||||
//直接发走暂态事件
|
//直接发走暂态事件
|
||||||
transfer_json_qvvr_data(id,event.head.name,
|
/*transfer_json_qvvr_data(id,event.head.name,
|
||||||
record.fMagntitude,record.fPersisstime,record.triggerTimeMs,record.nType,record.phase,"");
|
record.fMagntitude,record.fPersisstime,record.triggerTimeMs,record.nType,record.phase,"");*/
|
||||||
|
enqueue_qvvr_json_update(id, event.head.name, record.fMagntitude, record.fPersisstime, record.triggerTimeMs, record.nType, record.phase, "");
|
||||||
}
|
}
|
||||||
//通知状态机补招暂态事件成功
|
//通知状态机补招暂态事件成功
|
||||||
on_device_response_minimal(static_cast<int>(ResponseCode::OK), id, 0, static_cast<int>(DeviceState::READING_EVENTLOG));
|
on_device_response_minimal(static_cast<int>(ResponseCode::OK), id, 0, static_cast<int>(DeviceState::READING_EVENTLOG));
|
||||||
|
|||||||
Reference in New Issue
Block a user