查看单个帖子
旧 2007-03-25, 11:42 AM   #3
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 用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;
}
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖