📄 sbtrd.cpp
字号:
// Use _beginthreadex( ) so that the CRT (common runtime // environment) is fully initialized so all CRT functions work, // CreateThread( ) doesn't do this. However, this is Microsoft Visual C++ // specific, not part of the official Win32 API. typedef unsigned int (__stdcall *beginthreadfunc)(void *); beginthreadfunc func = reinterpret_cast<beginthreadfunc>(thread_function); void *arg = static_cast<void *>(thread_arg); result->threadHandle = reinterpret_cast<HANDLE>(_beginthreadex(NULL, g_threadStackSize, func, arg, 0, &result->threadID)); if (result->threadHandle == 0) { delete result; return VXItrd_RESULT_FATAL_ERROR; } *thread = result; return VXItrd_RESULT_SUCCESS; } /** * Destroy a thread handle * * Note: this does NOT stop or destroy the thread, it just releases * the handle for accessing it. If this is not done, a memory leak * occurs, so if the creator of the thread never needs to communicate * with the thread again it should call this immediately after the * create if the create was successful. * * @param thread Handle to the thread to destroy * * @result VXItrdResult 0 on success */ VXITRD_API VXItrdResult VXItrdThreadDestroyHandle(VXItrdThread **thread) { if ((! thread) || (! *thread)) return VXItrd_RESULT_INVALID_ARGUMENT; CloseHandle ((*thread)->threadHandle); delete *thread; *thread = NULL; return VXItrd_RESULT_SUCCESS; } /** * Purpose Terminate a thread. Called by the thread on exit. * * @param status Exit code for the thread * @result N/A, never returns */ VXITRD_API void VXItrdThreadExit(VXItrdThreadArg status) { _endthreadex(reinterpret_cast<unsigned int>(status)); } /** * Causes the calling thread to wait for the termination of a specified * 'thread' with a specified timeout, in milliseconds. * * @param thread the 'thread' that is waited for its termination. * @param status contains the exit value of the thread's start routine. * @return VXItrdResult of operation. Return SUCCESS if specified 'thread' * terminating. */ VXITRD_API VXItrdResult VXItrdThreadJoin(VXItrdThread *thread, VXItrdThreadArg *status, long timeout) { if ((thread == NULL ) || (status == NULL) || (timeout < -1)) return VXItrd_RESULT_INVALID_ARGUMENT; if (timeout == -1) timeout = INFINITE; VXItrdResult rc; switch (WaitForSingleObject(thread->threadHandle, timeout)) { case WAIT_OBJECT_0: case WAIT_ABANDONED: rc = VXItrd_RESULT_SUCCESS; break; case WAIT_TIMEOUT: rc = VXItrd_RESULT_FAILURE; break; default: rc = VXItrd_RESULT_FATAL_ERROR; } DWORD stat; if (rc == VXItrd_RESULT_SUCCESS) { if (GetExitCodeThread(thread->threadHandle, &stat) == 0) rc = VXItrd_RESULT_FATAL_ERROR; else *status = reinterpret_cast<VXItrdThreadArg>(stat); } return rc; } /** * Get the thread ID for the specified thread * * @param thread Handle to the thread to get the ID for * * @result Thread ID number */ VXITRD_API VXIthreadID VXItrdThreadGetIDFromHandle(VXItrdThread *thread) { if (thread == NULL) return (VXIthreadID) -1; return thread->threadID; } /** * Purpose Get the ID of the current handle. * * @return The current thread handle identifier. * */ VXITRD_API VXIthreadID VXItrdThreadGetID(void) { return GetCurrentThreadId(); } /** * Purpose Yield the process schedule in the current thread. * * @return void * */ VXITRD_API void VXItrdThreadYield(void) { Sleep(0); } /** * Purpose Create a timer * * @param mutex a pointer to a mutex * @return VXItrdResult of operation. Return SUCCESS if timer has been * created * */ VXITRD_API VXItrdResult VXItrdTimerCreate(VXItrdTimer **timer) { if (timer == NULL) return VXItrd_RESULT_INVALID_ARGUMENT; *timer = NULL; // Create the wrapper object VXItrdTimer *result = new VXItrdTimer; if (result == NULL) return VXItrd_RESULT_OUT_OF_MEMORY; // Create the timer, a Win32 event result->timerEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (result->timerEvent == NULL) { delete result; return VXItrd_RESULT_FATAL_ERROR; } *timer = result; return VXItrd_RESULT_SUCCESS; } /** * Purpose Destroy a timer * * @param timer a pointer to a timer * @return VXItrdResult of operation. Return SUCCESS if timer has been * created * */ VXITRD_API VXItrdResult VXItrdTimerDestroy(VXItrdTimer **timer) { if ((! timer) || (! *timer)) return VXItrd_RESULT_INVALID_ARGUMENT; if (CloseHandle((*timer)->timerEvent) == FALSE) return VXItrd_RESULT_FATAL_ERROR; delete *timer; *timer = NULL; return VXItrd_RESULT_SUCCESS; } /** * Purpose Puts the current thread to sleep for a configurable duration. * Due to other activities of the machine, the delay is the minimum * length that the timer will wait. * * @param timer a pointer to a timer * @param millisecondDelay the minimum number of milliseconds to wait * @param interrupted a pointer (may optionally be NULL) indicating whether * or not the sleep was interrupted by VXItrdTimerWake. * @return VXItrdResult of operation. Return SUCCESS if timer could sleep. * */ VXITRD_API VXItrdResult VXItrdTimerSleep(VXItrdTimer *timer, VXIint millisecondDelay, VXIbool *interrupted) { if ((timer == NULL) || (millisecondDelay < 0)) return VXItrd_RESULT_INVALID_ARGUMENT; switch (WaitForSingleObject(timer->timerEvent, millisecondDelay)) { case WAIT_OBJECT_0: if (interrupted != NULL) *interrupted = 1; break; case WAIT_TIMEOUT: if (interrupted != NULL) *interrupted = 0; break; default: return VXItrd_RESULT_FATAL_ERROR; } return VXItrd_RESULT_SUCCESS; } /** * Purpose Wakes a sleeping thread, if the target is not already sleeping * it immediately wakes when it tries to sleep the next time. * * @param timer a pointer to a timer * @return VXItrdResult of operation. Return SUCCESS if timer could wake. * */ VXITRD_API VXItrdResult VXItrdTimerWake(VXItrdTimer *timer) { if (timer == NULL) return VXItrd_RESULT_INVALID_ARGUMENT; if (SetEvent(timer->timerEvent) == 0) return VXItrd_RESULT_FATAL_ERROR; return VXItrd_RESULT_SUCCESS; } /** * Initialize the TRD utilities library * * @param threadStackSize Stack size to use when creating new threads. * Pass 0 to use the default (OS-specific) size, * usually this means new threads will use the * same stack size as the main (parent) process. * * @return VXItrd_RESULT_SUCCESS if sucess, different value on failure */ VXITRD_API VXItrdResult VXItrdInit (VXIint32 threadStackSize) { if (threadStackSize >= 0) g_threadStackSize = threadStackSize; return VXItrd_RESULT_SUCCESS; } /** * Shutdown the TRD utilities library * * @return VXItrd_RESULT_SUCCESS if sucess, different value on failure */ VXITRD_API VXItrdResult VXItrdShutDown () { return VXItrd_RESULT_SUCCESS; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -