int AppTask_Custom_Add(int mode, LCUI_Func *func_data) /* * 功能:使用自定义方式添加程序任务 * 用法示例: * 在函数的各参数与队列中的函数及各参数不重复时,添加它 * AppTask_Custom_Add(ADD_MODE_NOT_REPEAT | AND_ARG_F | AND_ARG_S, func_data); * 只要函数和参数1不重复则添加 * AppTask_Custom_Add(ADD_MODE_NOT_REPEAT | AND_ARG_F, func_data); * 要函数不重复则添加 * AppTask_Custom_Add(ADD_MODE_NOT_REPEAT, func_data); * 添加新的,不管是否有重复的 * AppTask_Custom_Add(ADD_MODE_ADD_NEW, func_data); * 有相同函数则覆盖,没有则新增 * AppTask_Custom_Add(ADD_MODE_REPLACE, func_data); * */ { int total, i; /* 先获取程序数据结构体指针 */ LCUI_App *app; LCUI_FuncQueue *queue; LCUI_Func *temp = NULL; if( func_data->id == (LCUI_ID)0 ) { app = Get_Self_AppPointer(); } else { app = Find_App( func_data->id ); } if( !app ) { return -1; } queue = &app->task_queue; total = Queue_Get_Total(queue); /* 如果模式是“添加新的”模式 */ if( mode == ADD_MODE_ADD_NEW ) { Queue_Add(queue, func_data); return 0; } //printf("mode: %d\n", mode); for (i = 0; i < total; ++i) { //printf("1\n"); temp = Queue_Get(queue, i); /* 如果指针无效,或者函数指针已有记录 */ if( !temp || temp->func != func_data->func ) { continue; } /* 如果要求的是不重复模式 */ if(Check_Option(mode, ADD_MODE_NOT_REPEAT)) { /* 如果要求是第1个参数不能重复 */ if(Check_Option(mode, AND_ARG_F)) { //printf("ADD_MODE_NOT_REPEAT, AND_ARG_F\n"); //printf("old:%p, new:%p\n", queue->queue[i].arg_f, arg_f); /* 如果要求是第2个参数也不能重复 */ if(Check_Option(mode, AND_ARG_S)) { /* 如果函数以及参数1和2都一样 */ if(temp->arg[0] == func_data->arg[0] && temp->arg[1] == func_data->arg[1]) { __destroy_apptask( func_data ); return -1; } } else {/* 否则,只是要求函数以及第1个参数不能全部重复 */ if(temp->arg[0] == func_data->arg[0]) { __destroy_apptask( func_data ); return -1; } } }/* 否则,如果只是要求是第2个参数不能重复 */ else if(Check_Option(mode, AND_ARG_S)) { if(temp->arg[1] == func_data->arg[1] ) { __destroy_apptask( func_data ); return -1; } } else {/* 否则,只是要求函数不同 */ __destroy_apptask( func_data ); return -1; } }/* 如果要求的是替换模式 */ else if(Check_Option(mode, ADD_MODE_REPLACE)) { //printf("ADD_MODE_REPLACE\n"); /* 如果要求是第1个参数相同 */ if( Check_Option(mode, AND_ARG_F) ) { /* 如果要求是第2个参数也相同 */ if( Check_Option(mode, AND_ARG_S) ) { if(temp->arg[0] == func_data->arg[0] && temp->arg[1] == func_data->arg[1] ) { break; } } else {/* 否则,只是要求函数以及第1个参数全部相同 */ if(temp->arg[0] == func_data->arg[0]) { // printf("ARG_F\n"); break; } } }/* 否则,如果只是要求第2个参数不能相同 */ else if(Check_Option(mode, AND_ARG_S)) { if(temp->arg[1] == func_data->arg[1]) { break; } } else { break; } } } if(i == total) { Queue_Add(queue, func_data); } else { Queue_Replace( queue, i, func_data ); } return 0; }
static int Tasks_CustomAdd( LCUI_Queue *tasks, int mode, LCUI_Task *task ) { int total, i; LCUI_Task *tmp_task; Queue_Lock( tasks ); total = Queue_GetTotal(tasks); /* 如果模式是“添加新的”模式 */ if( mode == ADD_MODE_ADD_NEW ) { Queue_Add(tasks, task); Queue_Unlock( tasks ); return 0; } for (i=0; i < total; ++i) { tmp_task = Queue_Get(tasks, i); /* 如果指针无效,或者函数指针已有记录 */ if( !tmp_task || tmp_task->func != task->func ) { continue; } /* 如果要求的是不重复模式 */ if(Check_Option(mode, ADD_MODE_NOT_REPEAT)) { /* 如果要求是第1个参数不能重复 */ if(Check_Option(mode, AND_ARG_F)) { /* 如果要求是第2个参数也不能重复 */ if(Check_Option(mode, AND_ARG_S)) { /* 如果函数以及参数1和2都一样 */ if(tmp_task->arg[0] == task->arg[0] && tmp_task->arg[1] == task->arg[1]) { Destroy_Task( task ); Queue_Unlock( tasks ); return -1; } } else {/* 否则,只是要求函数以及第1个参数不能全部重复 */ if(tmp_task->arg[0] == task->arg[0]) { Destroy_Task( task ); Queue_Unlock( tasks ); return -1; } } }/* 否则,如果只是要求是第2个参数不能重复 */ else if(Check_Option(mode, AND_ARG_S)) { if(tmp_task->arg[1] == task->arg[1] ) { Destroy_Task( task ); Queue_Unlock( tasks ); return -1; } } else {/* 否则,只是要求函数不同 */ Destroy_Task( task ); Queue_Unlock( tasks ); return -1; } }/* 如果要求的是替换模式 */ else if(Check_Option(mode, ADD_MODE_REPLACE)) { /* 如果要求是第1个参数相同 */ if( Check_Option(mode, AND_ARG_F) ) { /* 如果要求是第2个参数也相同 */ if( Check_Option(mode, AND_ARG_S) ) { if(tmp_task->arg[0] == task->arg[0] && tmp_task->arg[1] == task->arg[1] ) { break; } } else {/* 否则,只是要求函数以及第1个参数全部相同 */ if(tmp_task->arg[0] == task->arg[0]) { break; } } }/* 否则,如果只是要求第2个参数不能相同 */ else if(Check_Option(mode, AND_ARG_S)) { if(tmp_task->arg[1] == task->arg[1]) { break; } } else { break; } } } if(i == total) { Queue_Add(tasks, task); } else { Queue_Replace( tasks, i, task ); } Queue_Unlock( tasks ); return 0; }