几何尺寸与公差论坛

 找回密码
 注册
查看: 2225|回复: 2

用Win32SDK并发线程的问题。。。。。。。。

[复制链接]
发表于 2007-3-25 11:40:03 | 显示全部楼层 |阅读模式
参考   MFC   关于   CWinThread   的源代码
 楼主| 发表于 2007-3-25 11:41:59 | 显示全部楼层

回复: 用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;
 楼主| 发表于 2007-3-25 11:42:48 | 显示全部楼层

回复: 用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;   
  }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-22 23:44 , Processed in 0.037071 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表