⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
		DEBUGMSG( DEBUG_CREATETHREAD, ( "_CreateThread:alloc thread struct.\r\n" ) );
		// 分配线程结构
		lpThread = AllocThreadStruct();
		
		if( lpThread )
		{
			DEBUGMSG( DEBUG_CREATETHREAD, ( "_CreateThread: alloc thread handle.\r\n" ) );
			hThread = Handle_Alloc( lpProcess, lpThread, OBJ_THREAD ); // 分配句柄
			//DEBUGMSG( DEBUG_CREATETHREAD, ( "_C5.\r\n" ) );
			if( hThread )
			{
				DEBUGMSG( DEBUG_CREATETHREAD, ( "_CreateThread: call InitThreadData.\r\n" ) );
				// 初始化线程结构数据
				if( InitThreadData( 
					lpThread, 
					lpProcess, 
					hThread,
					dwStackSize, 
					dwPreservStackSize,
					lpStartAddress, 
					lpParameter,
					dwCreationFlags | CREATE_SUSPENDED, // 先挂起
					&dwThreadID	 ) )
				{
					if( lpThreadId )
						*lpThreadId = dwThreadID;
					lpThread->uiRefCount = 1;  // add referent count
					DEBUGMSG( DEBUG_CREATETHREAD, ( "_CreateThread: success, handle=0x%x,id=0x%x,proc=0x%s.\r\n", hThread, dwThreadID, lpProcess->lpszApplicationName ) );
					if( (dwCreationFlags&CREATE_SUSPENDED) == 0 ) // 是否先挂起
						//_WakeupThread( lpThread, FALSE ); // 否,将线程加入运行队列
						DoResumeThread( lpThread );// 否,将线程加入运行队列
				}
				else
				{   // 初始化失败
					RETAILMSG( 1, ( "error : _CreateThread:call InitThreadData failure!.\r\n" ) );
					Handle_Free( hThread, TRUE );
					FreeThreadStruct( lpThread );
					lpThread = NULL;
				}
			}
			else
			{   // 分配句柄失败
				RETAILMSG( 1, ( "error : _CreateThread:not alloc handle!.\r\n" ) );
				FreeThreadStruct( lpThread );
				lpThread = NULL;
			}
		}
		else
		{   //
			RETAILMSG( 1, ( "error : _CreateThread:no enough memory!.\r\n" ) );
		}
    }
    return lpThread;
}

// ********************************************************************
// 声明:HANDLE WINAPI KL_CreateThread(
//					  LPSECURITY_ATTRIBUTES lpThreadAttributes,   //
//					  DWORD dwStackSize,                      //
//					  LPTHREAD_START_ROUTINE lpStartAddress, //
//					  LPVOID lpParameter,                //
//					  DWORD dwCreationFlags,         //
//					  LPDWORD lpThreadId         //
//					  )

// 参数:
//		IN lpThreadAttributes - 安全属性
//		IN dwStackSize - 该线程的需要的运行栈大小
//		IN lpStartAddress - 线程启动函数入口
//		IN lpParameter - 传递给线程的参数
//		IN dwCreationFlags - 创建标志,可以为:
//					CREATE_SUSPENDED - 创建后挂起,直到调用ResumeThread
//		OUT lpThreadId - 用于接受线程ID的指针
// 返回值:
//		假如成功,返回线程句柄;否则,返回NULL	
// 功能描述:
//		创建新的线程
// 引用:
//		系统API	
// ********************************************************************
HANDLE WINAPI KL_CreateThread(
					  LPSECURITY_ATTRIBUTES lpThreadAttributes,   //
					  DWORD dwStackSize,                      //
					  LPTHREAD_START_ROUTINE lpStartAddress, //
					  LPVOID lpParameter,                //
					  DWORD dwCreationFlags,         //
					  LPDWORD lpThreadId         //
					  )
{
	LPTHREAD lpThread;
	lpThread = _CreateThread( GetAPICallerProcessPtr(), lpThreadAttributes, dwStackSize, 0, lpStartAddress, lpParameter, dwCreationFlags & ~CREATE_MAINTHREAD, lpThreadId );
	if( lpThread )
		return lpThread->hThread;
	return NULL;
}

// ********************************************************************
// 声明:BOOL WINAPI KL_SetThreadPriority( HANDLE hThread, long lPriority, UINT flag )
// 参数:
//		IN hThread - 线程句柄
//		IN lPriority - 线程优先级, 当 bPriorityValue 为FALSE时 为-15 ~ 15,这时指相对值,否则lPriority指0 ~ 255的绝对值
//		IN flag - 指lPriority代表的是相对值或是绝对值
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		设置线程优先级
// 引用:
//		系统API
// ********************************************************************
#define DEBUG_SetThreadPriority 0
BOOL WINAPI KL_SetThreadPriority( HANDLE hThread, long lPriority, UINT flag )
{
	LPTHREAD lpThread;

	DEBUGMSG( DEBUG_SetThreadPriority, ( "KL_SetThreadPriority:hThread=0x%x.lPriority=0x%x,flag=0x%x.\r\n", hThread,lPriority,flag  ) );
	if( flag == 0 )
	{  // 相对值 
		if( lPriority >= -15 && lPriority <= 15)
		{		
			lPriority = DEF_PRIORITY - lPriority;//lPriority为相对于DEF_PRIORITY的值
		}
		else
			goto _error_return;
	}
	
	if( (ULONG)lPriority > 255 ) 
        goto _error_return;

	if( hThread == CURRENT_THREAD_HANDLE )
		lpThread = lpCurThread;
	else
		lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );
	
	if( lpThread )
	{
		lpThread->nOriginPriority = (BYTE)lPriority;
		SetThreadCurrentPriority( lpThread, lPriority );
		DEBUGMSG( DEBUG_SetThreadPriority, ( "KL_SetThreadPriority: lpThread->nOriginPriority=0x%x.\r\n", lpThread->nOriginPriority ) );
		return TRUE;
	}
	else
	{
		WARNMSG( DEBUG_SetThreadPriority, ( "KL_SetThreadPriority: Invalid handle=0x%x.\r\n", hThread ) );
	}

_error_return:
	KL_SetLastError( ERROR_INVALID_PARAMETER );
	return FALSE;
}
// ********************************************************************
// 声明:int WINAPI KL_GetThreadPriority( HANDLE hThread, UINT flag )
// 参数:
//		IN hThread - 线程句柄
//		IN flag - 指lPriority代表的是相对值或是绝对值
// 返回值:
//		假如成功,返回优先级; 否则,返回 THREAD_PRIORITY_ERROR_RETURN
// 功能描述:
//		得到线程优先级
// 引用:
//		系统API
// ********************************************************************
int WINAPI KL_GetThreadPriority( HANDLE hThread, UINT flag )
{
	LPTHREAD lpThread;

	if( hThread == CURRENT_THREAD_HANDLE )
		lpThread = lpCurThread;
	else
		lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD ); // 由句柄得到线程对象的指针
	
	if( lpThread )
	{
		int retv;
		if( flag == 0 )
		{  // 得到相对值,在 -15 ~ 15 之间
		    retv = DEF_PRIORITY - lpThread->nOriginPriority;
			if( retv > 15 || retv < -15 )
				goto _error_return;
		}
		else  // 绝对值
			retv = lpThread->nOriginPriority;
		return retv;
	}
_error_return:
    return THREAD_PRIORITY_ERROR_RETURN;
}
// ********************************************************************
// 声明:BOOL WINAPI KL_SetThreadPolicy( HANDLE hThread, UINT uiPolicy )
// 参数:
//		IN hThread - 线程句柄
//		IN uiPolicy - 线程规则,为以下值:
//				THREAD_POLICY_OTHER - 默认的策略
//				THREAD_POLICY_ROTATION - 轮转调度,每次调度时,当前运行线程都会放到运行队列尾
//				THREAD_POLICY_FIFO - 先进先出
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		设置调度策略
// 引用:
//		系统API
// ********************************************************************
BOOL WINAPI KL_SetThreadPolicy( HANDLE hThread, UINT uiPolicy )
{
	LPTHREAD lpThread;

	if( hThread == CURRENT_THREAD_HANDLE )
		lpThread = lpCurThread;
	else
		lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );

	if( lpThread )
    {
		if( (WORD)uiPolicy == THREAD_POLICY_OTHER ||
			(WORD)uiPolicy == THREAD_POLICY_ROTATION ||
			(WORD)uiPolicy == THREAD_POLICY_FIFO )
		{
            lpThread->fPolicy = (BYTE)uiPolicy;
			return TRUE;
		}
		KL_SetLastError( ERROR_INVALID_PARAMETER );
    }	
    return FALSE;
}
// ********************************************************************
// 声明:int WINAPI KL_GetThreadPolicy( HANDLE hThread )
// 参数:
//		IN hThread - 线程句柄
// 返回值:
//		返回值可以为以下值
//			THREAD_POLICY_OTHER: 该线程由系统降低其动态优先级计数,并由系统决定是否让该thread放弃CPU的使用权
//	    THREAD_POLICY_FIFO:系统不会降低该线程的动态优先级计数
//			THREAD_POLICY_ROTATION:系统不会降低该线程的动态优先级计数,但当该线程产生切换时,该线程将回放到同级优先级队列的队尾
// 功能描述:
//		得到线程调度规则
// 引用:
//		系统API
// ********************************************************************
int WINAPI KL_GetThreadPolicy( HANDLE hThread )
{
	LPTHREAD lpThread;

	if( hThread == CURRENT_THREAD_HANDLE )
		lpThread = lpCurThread;
	else
		lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );

	if( lpThread )
    {
        return lpThread->fPolicy;
    }
    return THREAD_POLICY_ERROR;
}

// ********************************************************************
// 声明:DWORD WINAPI KL_ResumeThread( HANDLE hThread )
// 参数:
//		IN hThread - 线程句柄
// 返回值:
//		假如成功,返回之前的计数值;否则,返回-1
// 功能描述:
//		恢复线程执行,如果线程之前有多次挂起(调用SuspendThread)操作,必须调用
//		同样多次ResumeThread功能才能让线程由挂起态转为运行态。
// 引用:
//		系统API
// ********************************************************************

DWORD WINAPI KL_ResumeThread( HANDLE hThread )
{
	LPTHREAD lpThread;

	lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );

    if( lpThread )
		return DoResumeThread( lpThread );
	return -1;
}

// ********************************************************************
// 声明:DWORD WINAPI KL_SuspendThread( HANDLE hThread )
// 参数:
//		IN hThread - 线程句柄
// 返回值:
//		假如成功,返回之前的计数值;否则,返回-1
// 功能描述:
//		挂起线程,如果线程当前是运行态,则当执行该功能后,线程将会转为挂起态。
//		如果线程之前有多次挂起(调用SuspendThread)操作,必须调用
//		同样多次ResumeThread功能才能让线程由挂起态转为运行态。
// 引用:
//		系统API
// ********************************************************************

DWORD WINAPI KL_SuspendThread( HANDLE hThread )
{
	LPTHREAD lpThread;

	if( hThread == CURRENT_THREAD_HANDLE )
		lpThread = lpCurThread;
	else
		lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );//2003-05-22, ADD
    if( lpThread )
	    return DoSuspendThread( lpThread );

	return -1;
}

// ********************************************************************
// 声明:BOOL WINAPI KL_GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode )
// 参数:
//		IN hThread - 线程句柄
//		OUT lpExitCode - 用于接受线程退出代码
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		得到线程的退出代码。如果该线程当前没有退出,则返回STILL_ACTIVE。否则,为一下值之一:
//		ExitThread 或 TerminateThread 的值;线程返回值;线程的进程的返回值
// 引用:
//		系统API
// ********************************************************************
BOOL WINAPI KL_GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode )
{
	LPTHREAD lpThread;

	if( hThread == CURRENT_THREAD_HANDLE )
	{
		*lpExitCode = STILL_ACTIVE;
		return TRUE;
	}
	else
		lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );

	if( lpThread )
    {
		*lpExitCode = STILL_ACTIVE;
        return TRUE;
	}
	else
	{
		 return GetHandleUserInfo( hThread, lpExitCode );
	}
}

// ********************************************************************
// 声明:BOOL FASTCALL Thread_Close( HANDLE hThread )
// 参数:
//		IN hThread - 线程句柄
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		当用户调用CloseHandle时,会调用该函数去处理释放线程对象的工作
// 引用:
//		hmgr.c 
// ********************************************************************
BOOL FASTCALL Thread_Close( HANDLE hThread )
{
	LPTHREAD lpThread = (LPTHREAD)HandleToPtr( hThread, OBJ_THREAD );  // 由句柄得到线程对象指针

	if( lpThread )
	{
		if( lpThread->uiRefCount )
		    lpThread->uiRefCount--;
		if( hThread == lpThread->hThread )
		    lpThread->hThread = NULL;
		return TRUE;
	}
	return FALSE;
}

// ********************************************************************
// 声明:BOOL WINAPI KL_SwitchToThread( VOID )
// 参数:
//		无
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		当前线程主动放弃CPU
// 引用:
//		系统API
// ********************************************************************
BOOL WINAPI KL_SwitchToThread( VOID )
{
    extern void CALLBACK Schedule(void);
	ScheduleTimeout(0);
	return TRUE;
}

// ********************************************************************
// 声明:void WINAPI KL_SetLastError( DWORD dwErrorCode )
// 参数:
//		IN dwErrorCode - 错误代码
// 返回值:
//		无
// 功能描述:
//		设置线程当前的错误代码
// 引用:
//		系统API
// ********************************************************************
void WINAPI KL_SetLastError( DWORD dwErrorCode )
{
    lpCurThread->dwErrorCode = dwErrorCode;
}

// ********************************************************************
// 声明:DWORD WINAPI KL_GetLastError( void )
// 参数:
//		无
// 返回值:
//		线程当前的错误代码
// 功能描述:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -