fix error in recall when hours more than 300

This commit is contained in:
lnk
2025-08-01 16:31:57 +08:00
parent acbaf89459
commit 3b5b14f9ae
5 changed files with 200 additions and 19 deletions

View File

@@ -2183,11 +2183,76 @@ int parse_file_names_by_fltnum(int fltnum, char* domname, char** filenames, int
//WW2023-11-01 end
//补招部分////////////////////////////////////////////////////////////////////////////////
////////////////////////////20250801
/* 最小块,每次至少扩容这么多;也可以调大一点 */
#define RECALL_CHUNK 64
/* 初始化 */
void recall_xml_init(recall_xml_t *rx) // ★
{
rx->work_cnt = rx->work_cap = 0;
rx->new_cnt = rx->new_cap = 0;
rx->work_recalls = rx->new_recalls = nullptr;
}
/* 若需要,扩容 `*arr` 直到能放下 needed 条记录 */
static int ensure_cap(recall_t **arr, int *cap, int need)
{
if (need <= *cap) return 0;
int new_cap = (*cap) ? (*cap) : 16;
while (new_cap < need) new_cap <<= 1;
/* C++ 里要显式转换 */
void *mem = realloc(*arr, new_cap * sizeof(recall_t));
if (!mem) return -1;
*arr = static_cast<recall_t *>(mem); // ★ 显式 static_cast
*cap = new_cap;
return 0;
}
/* push 到 work / new 数组 */
static int push_work(recall_xml_t *rx, const recall_t *rec)
{
if (ensure_cap(&rx->work_recalls, &rx->work_cap, rx->work_cnt + 1))
return -1;
rx->work_recalls[rx->work_cnt++] = *rec;
return 0;
}
static int push_new(recall_xml_t *rx, const recall_t *rec)
{
if (ensure_cap(&rx->new_recalls, &rx->new_cap, rx->new_cnt + 1))
return -1;
rx->new_recalls[rx->new_cnt++] = *rec;
return 0;
}
/* 释放内存(栈退出前或不用时调用) */
void recall_xml_free(recall_xml_t *rx) // ★
{
for (int i = 0; i < rx->work_cnt; ++i)
free(rx->work_recalls[i].line_id);
for (int i = 0; i < rx->new_cnt; ++i)
free(rx->new_recalls[i].line_id);
free(rx->work_recalls);
free(rx->new_recalls);
recall_xml_init(rx); /* 复位为全 0防止悬挂指针 */
}
////////////////////////////20250801
void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& recall_e, char* id)
{
recall_t recall;
//recall_t recall;//lnk20250801
recall.line_id = id;
//recall.line_id = id;
recall_t recall = {0};
recall.line_id = strdup(id); /* malloc 字符串 */
QDateTime start_dt = QDateTime::fromString(recall_e.attribute("StartTime"), "yyyy-MM-dd hh:mm:ss");
recall.start_time = start_dt.toMSecsSinceEpoch() / 1000;
@@ -2201,10 +2266,12 @@ void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& reca
<< " " << recall.start_time << " " << recall.end_time;
if (parentTag == "Work") {
recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
//recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
push_work(recall_xml, &recall);
}
else if (parentTag == "New") {
recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
//recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
push_new(recall_xml, &recall);
}
}
@@ -2295,7 +2362,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
return APR_SUCCESS;
}
void process_recall_config(recall_xml_t* recall_xml)
/*void process_recall_config(recall_xml_t* recall_xml)
{
int i, j;
recall_t* recall;
@@ -2328,13 +2395,18 @@ void process_recall_config(recall_xml_t* recall_xml)
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) { //
if (LD_info->autorecallcount != 0) {
for (int j = 0; j < LD_info->autorecallcount; j++) {
delete LD_info->autorecall[j];
delete[] LD_info->autorecall[j];//避免重复释放lnk20250801
}
delete LD_info->autorecall;
LD_info->autorecallcount = 0;
}
LD_info->autorecallcount = recall_num;
LD_info->autorecall = new autorecall_t * [recall_num];
for (int k = 0; k < recall_num; ++k) {
LD_info->autorecall[k] = nullptr; //避免野指针lnk20250801
}
for (int j = 0; j < recall_num; j++) {
printf("\n %d ===== %d\n", recall[j].start_time, recall[j].end_time);
LD_info->autorecall[j] = new autorecall_t[1];
@@ -2352,10 +2424,104 @@ void process_recall_config(recall_xml_t* recall_xml)
}
}
//调试
printf("== autorecall count = %d ==\n", LD_info->autorecallcount);
for (int j = 0; j < LD_info->autorecallcount; ++j) {
if (LD_info->autorecall[j] == nullptr) {
printf("autorecall[%d] = nullptr !!!\n", j);
} else {
printf("autorecall[%d] = %p | start = %d, end = %d\n",
j, LD_info->autorecall[j],
LD_info->autorecall[j]->start, LD_info->autorecall[j]->end);
}
}
}
}
}*/
void process_recall_config(recall_xml_t *rx)
{
if (rx->new_cnt) {
/* 预留空间 */
if (ensure_cap(&rx->work_recalls, &rx->work_cap,
rx->work_cnt + rx->new_cnt))
return; /* 内存不足,直接返回 */
memcpy(&rx->work_recalls[rx->work_cnt],
rx->new_recalls,
rx->new_cnt * sizeof(recall_t));
rx->work_cnt += rx->new_cnt;
rx->new_cnt = 0;
}
/* work 列表为空,直接结束 */
if (rx->work_cnt == 0)
return;
recall_t *recall = rx->work_recalls;
int recall_num = rx->work_cnt;
LD_info_t *LD_info = find_LD_info_only_from_mp_id(recall[0].line_id);
printf("\n recall[0].line_id == %s \n", recall[0].line_id);
printf("\n recall[0].start_time == %lld \n", recall[0].start_time);
if (!LD_info || LD_info->read_flag == 0) {
printf("\n Find LD_info == null \n");
return;
}
printf("\n Find LD_info != null \n");
/* 若正在补招中则跳过;否则装载新补招队列 */
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) {
/* 先释放旧队列 */
if (LD_info->autorecallcount != 0) {
for (int j = 0; j < LD_info->autorecallcount; ++j)
delete[] LD_info->autorecall[j]; /* 原逻辑 */
delete LD_info->autorecall;
LD_info->autorecallcount = 0;
}
/* 重新分配新队列,大小 = recall_num */
LD_info->autorecallcount = recall_num;
LD_info->autorecall = new autorecall_t*[recall_num];
for (int k = 0; k < recall_num; ++k)
LD_info->autorecall[k] = nullptr;
for (int j = 0; j < recall_num; ++j) {
LD_info->autorecall[j] = new autorecall_t[1];
LD_info->autorecall[j]->start = recall[j].start_time;
LD_info->autorecall[j]->end = recall[j].end_time;
LD_info->autorecall[j]->need_steady = recall[j].need_steady;
LD_info->autorecall[j]->need_voltage = recall[j].need_voltage;
printf("\n %lld ===== %lld\n",
recall[j].start_time, recall[j].end_time);
}
LD_info->autorecallflag = 0; /* 重置“正在补招”标志 */
}
/* 调试输出 */
if(DEBUGOPEN){
printf("== autorecall count = %d ==\n", LD_info->autorecallcount);
for (int j = 0; j < LD_info->autorecallcount; ++j) {
if (!LD_info->autorecall[j])
printf("autorecall[%d] = nullptr !!!\n", j);
else
printf("autorecall[%d] = %p | start = %lld, end = %lld\n",
j, LD_info->autorecall[j],
LD_info->autorecall[j]->start,
LD_info->autorecall[j]->end);
}
}
}
//////////////////////////////////////////////////////////////////////////////////
void WebSocketThread::run()
@@ -5881,7 +6047,7 @@ void clearLDInfo(LD_info_t *ld_info) {
for (int i = 0; i < ld_info->autorecallcount; ++i) {
if (ld_info->autorecall[i] != nullptr) {
memset(ld_info->autorecall[i], 0, sizeof(autorecall_t));
delete ld_info->autorecall[i]; //删除数组元素空间,如果有正在补招的内容,则已经申请空间,需要释放
delete[] ld_info->autorecall[i]; //删除数组元素空间,如果有正在补招的内容,则已经申请空间,需要释放lnk20250801
}
}
delete ld_info->autorecall; //删除数组空间