📄 thread.c
字号:
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 + -