Пример #1
0
/** 设备处理线程 */
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);
}
Пример #2
0
/** 处理列表中的设备的数据 */
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);
}
Пример #3
0
/* 动态改变进度条的数据 */
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);
}
Пример #4
0
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;
}
Пример #5
0
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 );
	}
}
Пример #6
0
Файл: main.c Проект: yydaor/LCUI
/* 运行目标循环 */
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;
}
Пример #7
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);
}