几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   vc编程 (http://www.dimcax.com/hust/forumdisplay.php?f=76)
-   -   用Win32SDK并发线程的问题。。。。。。。。 (http://www.dimcax.com/hust/showthread.php?t=610)

huangyhg 2007-03-25 11:40 AM

用Win32SDK并发线程的问题。。。。。。。。
 
参考 MFC 关于 CWinThread 的源代码

huangyhg 2007-03-25 11:41 AM

回复: 用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;

huangyhg 2007-03-25 11:42 AM

回复: 用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;
}


所有的时间均为北京时间。 现在的时间是 07:42 PM.