/** 设备处理线程 */ static void DeviceThread( void *arg ) { DeviceData *data_ptr; int n, i, timeout_count = 0; is_running = TRUE; while( is_running ) { LCUIMutex_Lock( &list_mutex ); n = LinkedList_GetTotal( &dev_list ); for( i=0; i<n; ++i ) { data_ptr = (DeviceData*)LinkedList_Get( &dev_list ); if( !data_ptr || !data_ptr->proc ) { continue; } if( data_ptr->proc() ) { ++timeout_count; } } LCUIMutex_Unlock( &list_mutex ); if( timeout_count > 20 ) { LCUI_MSleep( 10 ); timeout_count = 0; } LCUI_MSleep( 5 ); } LCUIThread_Exit(NULL); }
/** 处理列表中的设备的数据 */ static void proc_dev_list( void *arg ) { LCUI_Queue *dev_list; dev_func_data *data_ptr; int total, i, timeout_count = 0; dev_list = (LCUI_Queue *)arg; while( LCUI_Active() ) { Queue_Lock( dev_list ); total = Queue_GetTotal( dev_list ); for(i=0; i<total; ++i) { data_ptr = (dev_func_data*)Queue_Get( dev_list, i ); if( !data_ptr || !data_ptr->proc_func ) { continue; } if( data_ptr->proc_func() ) { ++timeout_count; } } Queue_Unlock( dev_list ); if( timeout_count > 20 ) { LCUI_MSleep( 10 ); timeout_count = 0; } LCUI_MSleep( 5 ); } LCUIThread_Exit(NULL); }
/* 动态改变进度条的数据 */ static void change_progress( void *arg ) { char str[15]; int i, max = 100; LCUI_Widget *label; LCUI_Widget *widget; /* 创建一个label部件 */ widget = (LCUI_Widget *)arg; label = Widget_New("label"); /* 放到进度条里 */ Widget_Container_Add( widget, label ); /* 并且居中 */ Widget_SetAlign( label, ALIGN_MIDDLE_CENTER, Pos(0,0) ); /* 显示它 */ Widget_Show( label ); /* 设置最大值 */ ProgressBar_SetMaxValue(widget, max); for( i=0; i<max; i+=rand()%5 ) { /* 设置当前值 */ ProgressBar_SetValue(widget, i); /* 转换成字符串 */ sprintf( str, "%d%%", (int)(i*100.0/max) ); /* 设置显示的文本 */ Label_Text( label, str ); /* 暂停0.1秒 */ LCUI_MSleep(100); } ProgressBar_SetValue( widget, max ); Label_Text( label, "100%" ); LCUIThread_Exit(NULL); }
int test_thread( void ) { int ret = 0; TestWorkerRec worker; TestWorker_Init( &worker ); LCUIThread_Create( &worker.thread, TestWorker_Thread, &worker ); LCUI_Sleep( 1 ); TestWorker_Send( &worker, "hello" ); LCUI_MSleep( 200 ); TestWorker_Send( &worker, "world" ); LCUI_Sleep( 1 ); TestWorker_Send( &worker, "this" ); LCUI_MSleep( 500 ); TestWorker_Send( &worker, "is" ); LCUI_Sleep( 1 ); TestWorker_Send( &worker, "test" ); LCUI_MSleep( 100 ); TestWorker_Send( &worker, "bye!" ); LCUI_Sleep( 1 ); TestWorker_Destroy( &worker ); CHECK( worker.data_count == 7 ); return ret; }
static void Process_Frames( void ) /* 功能:处理动画的每一帧的更新 */ { int sleep_time = 10; LCUI_Frames *frames; while(!LCUI_Active()) { LCUI_MSleep(10); } frames = FramesStream_Update( &sleep_time ); reset_timer( __timer_id, sleep_time ); if( frames ) { Frames_CallFunc( frames ); } }
/* 运行目标循环 */ LCUI_API int LCUI_MainLoop_Run( LCUI_MainLoop *loop ) { LCUI_App *app; int idle_time = 1; #ifdef LCUI_BUILD_IN_WIN32 MSG msg; #endif app = LCUIApp_GetSelf(); if( !app ) { printf("%s(): %s", __FUNCTION__, APP_ERROR_UNRECORDED_APP); return -1; } DEBUG_MSG("loop: %p, enter\n", loop); loop->running = TRUE; while( !loop->quit && LCUI_Sys.state == ACTIVE ) { if( LCUIApp_HaveTask(app) ) { idle_time = 1; LCUIApp_RunTask( app ); } else { LCUI_MSleep (idle_time); if (idle_time < MAX_APP_IDLE_TIME) { idle_time += 1; } } #ifdef LCUI_BUILD_IN_WIN32 if( PeekMessage( &msg, Win32_GetSelfHWND(), 0, 0, PM_REMOVE) ) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } #endif } loop->running = FALSE; DEBUG_MSG("loop: %p, exit\n", loop); return 0; }
/** 定时器线程,用于处理列表中各个定时器 */ static void TimerThread( void *arg ) { int i, n; long int n_ms; LCUI_Func func_data; LCUI_Queue *timer_list; timer_data *timer = NULL; int64_t lost_ms; timer_list = (LCUI_Queue*)arg; func_data.arg[0] = NULL; func_data.arg[1] = NULL; while( !LCUI_Active() ) { LCUI_MSleep(10); } while( timer_thread_active ) { Queue_Lock( timer_list ); n = Queue_GetTotal( timer_list ); for(i=0; i<n; ++i) { timer = (timer_data*)Queue_Get( timer_list , i); if( !timer ) { continue; } if( timer->state == STATE_RUN ) { break; } } Queue_Unlock( timer_list ); /* 没有要处理的定时器,停留一段时间再进行下次循环 */ if(i >= n || !timer ) { LCUI_MSleep(10); continue; } lost_ms = LCUI_GetTicks( timer->start_time ); /* 减去处于暂停状态的时长 */ lost_ms -= timer->pause_ms; /* 若流失的时间未达到总定时时长 */ if( lost_ms < timer->total_ms ) { Queue_Lock( timer_list ); n_ms = timer->total_ms - lost_ms; /* 开始睡眠 */ LCUISleeper_StartSleep( &timer_sleeper, n_ms ); Queue_Unlock( timer_list ); lost_ms = LCUI_GetTicks( timer->start_time ); lost_ms -= timer->pause_ms; if( lost_ms < timer->total_ms ) { continue; } } DEBUG_MSG("timer: %d, start_time: %I64dms, cur_time: %I64dms, cur_ms: %I64d, total_ms: %ld\n", timer->id, timer->start_time, LCUI_GetTickCount(), timer->total_ms-lost_ms, timer->total_ms); /* 准备任务数据 */ func_data.id = timer->app_id; func_data.func = (CallBackFunc)timer->callback_func; func_data.arg[0] = timer->arg; func_data.destroy_arg[0] = FALSE; /* 添加该任务至指定程序的任务队列,添加模式是覆盖 */ AppTasks_CustomAdd( ADD_MODE_REPLACE | AND_ARG_F, &func_data ); Queue_Lock( timer_list ); /* 若需要重复使用,则重置剩余等待时间 */ if( timer->reuse ) { timer->start_time = LCUI_GetTickCount(); timer->pause_ms = 0; TimerList_UpdateTimerPos( timer_list, timer ); } else { /* 否则,释放该定时器 */ LCUITimer_Free( timer->id ); } Queue_Unlock( timer_list ); } LCUIThread_Exit(NULL); }