![]() |
用Win32SDK并发线程的问题。。。。。。。。
参考 MFC 关于 CWinThread 的源代码
|
回复: 用Win32SDK并发线程的问题。。。。。。。。
线程的运行状态
1。线程正常情况下只有两种运行状态:running和exited。 2。如果想让线成退出,给线程状态位置THREAD_EXIT,如果线程已经退出, 则此标志位为THREAD_EXITED 3。如果线程已经运行,应该对标识位置THREAD_RUNNING 4。在线程运行过程中,应对线程标志位作出判断,如果为THREAD_EXIT, 应该修改标识位为THREAD_EXITED,然后return 5。如果一个现成还没有开始运行,则标志位为THREAD_NONE ****************************************************************/ const unsigned char THREAD_EXIT = 0; const unsigned char THREAD_EXITED = 1; const unsigned char THREAD_NONE = 2; const unsigned char THREAD_RUNNING = 3; const unsigned short THREAD_EXIT_LIMIT = 500; //等待线程退出的时间上限 const unsigned short THREAD_PERIOD = 20; /**************************************************************** 用户自己可以控制运行与中止的线程结构。 考虑到Scada程序中非常多的用到了多线程技术,就封装了线程处理方面的 数据和函数,让用户自己可以操作线程是否退出。 备注:如果一个程序退出的时候没有停止正在运行的线程,会产生内存泄漏! 使用参考: THREAD m_thread; //定义一个线程 //定义线程所要处理的的函数,注意,此处不要有死循环,否则线成退出将失败 UINT ThreadProc(LPVOID lpParameter) { return TRUE; } //初始化线程 ThreadInit(&m_thread,ThreadProc,NULL,0,"线程使用示例"); //开启线程,线程开始后会一直运行,直到用户中止它! ThreadBegin(&m_thread); //退出线程 ThreadExit(&m_thread); ****************************************************************/ typedef struct tagTHREAD { char m_pszName[NAME_MAX_LEN]; UINT (*m_pfThreadProc)(LPVOID lpParameter); LPVOID m_lpParameter; UINT m_nThreadStatus; HANDLE m_hThread; UINT m_nExitTimeLimit; }THREAD,*LPTHREAD; |
回复: 用Win32SDK并发线程的问题。。。。。。。。
REALDB_API void ThreadInit(THREAD* lpThread,UINT (*m_pfThreadProc)(LPVOID),
LPVOID m_lpParameter,UINT nExitTimeLimit,char* pszThreadName) { ASSERT (lpThread != NULL); lpThread->m_pfThreadProc = m_pfThreadProc; lpThread->m_lpParameter = m_lpParameter; if (nExitTimeLimit >= 10) lpThread->m_nExitTimeLimit = nExitTimeLimit; else lpThread->m_nExitTimeLimit = THREAD_EXIT_LIMIT; strcpy(lpThread->m_pszName ,pszThreadName); lpThread->m_nThreadStatus = THREAD_NONE; lpThread->m_hThread = NULL; } DWORD WINAPI ThreadRun(LPVOID lpParameter) { THREAD* lpThread = (THREAD*)lpParameter; lpThread->m_nThreadStatus = THREAD_RUNNING; while (TRUE) { if (lpThread->m_pfThreadProc == NULL || lpThread->m_nThreadStatus == THREAD_EXIT) break; else { (*(lpThread->m_pfThreadProc))(lpThread->m_lpParameter); } Sleep(THREAD_PERIOD); } lpThread->m_nThreadStatus = THREAD_EXITED; lpThread->m_hThread = NULL; return TRUE; } REALDB_API BOOL ThreadBegin(THREAD* lpThread) { ASSERT (lpThread != NULL); DWORD dwThreadID; lpThread->m_hThread = CreateThread(NULL,0,ThreadRun, lpThread,0,&dwThreadID); ASSERT (lpThread->m_hThread != NULL); return TRUE; } REALDB_API BOOL ThreadExit(THREAD* lpThread) { ASSERT (lpThread != NULL); if (lpThread->m_hThread != NULL && lpThread->m_nThreadStatus == THREAD_RUNNING) { lpThread->m_nThreadStatus = THREAD_EXIT; UINT nTimePassed = 0; while (lpThread->m_nThreadStatus != THREAD_EXITED) { Sleep (THREAD_PERIOD); nTimePassed += THREAD_PERIOD; if (nTimePassed >= lpThread->m_nExitTimeLimit ) { LOG ("Error: %s退出超时!",lpThread->m_pszName ); ASSERT (FALSE); break; //超时了就不等线成退出了 } } LOG ("Message: %s退出!",lpThread->m_pszName ); lpThread->m_nThreadStatus = THREAD_EXITED; lpThread->m_hThread = NULL; } return TRUE; } |
所有的时间均为北京时间。 现在的时间是 08:25 PM. |