CEvent event1;
CEvent event2;
CWinThread *hand;UINT ThreadFunc0(LPVOID n)    //(1)这里为什么返回必须是uint?????
{
int *m=(int *)n;
for(int i=0;i<10;i++)
{
WaitForSingleObject(event1.m_hObject, INFINITE);
Sleep(500);
*m+=10;
printf("Thread 0= :%d launched \n", *m);
event1.ResetEvent();
event2.SetEvent();
}
return 0;
}UINT ThreadFunc1(LPVOID k)
{
for(int i=0;i<10;i++)
{
int result=WaitForSingleObject(event2.m_hObject,INFINITE);
Sleep(500);
printf("\tThread 1= :%d launched \n", k);
event2.ResetEvent();
event1.SetEvent();
SuspendThread((HANDLE)hand);               //(3)为什么这样也挂不起来??????
                hand->SuspendThread();        非要这样(最下面****中是我在搜到的答案,但是还是不懂,) }
return 0;
}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int i=12;
event1.SetEvent();
event2.ResetEvent(); printf("All Start: \n");
hand=AfxBeginThread(ThreadFunc0, (LPVOID)&i,0,CREATE_SUSPENDED,NULL);//(2)为什么这里创建的两个线程都没有挂起来,而是直接就执行了????
hand=AfxBeginThread(ThreadFunc1, (LPVOID)i,0,CREATE_SUSPENDED,NULL);
printf("main= :%d launched \n", i);
Sleep(10000);
return 0;

}
*************************************************搜的答案:
  执行SuspendThread(pthread)这一句时,   
  这里实际上是调用的:   
  DWORD   SuspendThread(   
      HANDLE   hThread       //   handle   to   the   thread   
  );   
  它只是简单的把参数pthread当成了要Suspend   的Thread   的handle来处理,因为CWinThread   *指针和handle都是32位的,你甚至可以这样:   
    
  CString   *ptemp   =   NULL;   
  int   i   =   SuspendThread(ptemp);   
    
  也能运行,只是当然返回的i是-1了,因为这时SuspendThread需要的参数Thread   的handle显然是不对的!   
    
  当用pthread->suspendthread();时,因为pthread可以正确知道CWinThread的成员HANDLE   m_hThread   ,当然调用能成功了!   
    
  所以你也可以这样:   
  int   i   =   SuspendThread(pthread->m_hThread);   
  也能成功。   
*******************************************
    上面的解释CString   *ptemp   =   NULL;   
  int   i   =   SuspendThread(ptemp);  
  也能允许,但是我的hand明显是创建线程时返回的对应CWinThred型,又不是随便找的一个32位的CWinThread   *指针或handle????
还有为什么 hand[i]=_beginthreadex(NULL,0,threadwork,(void *)i,CREATE_SUSPENDED,&ThreadID[i]);可以用
                   SuspendThread(HANDLE(hand[0]));???????????(4)空号里的(AFX_THREADPROC)thread(函数名),是不是可以不用写???
           用户线程和工作线程有什么区别,各有什么用?
(5)CreateThread也是创建进程它与有什么区别???或者说那些是C++的,WIN32的,MFC的?在MFC里面也可以用所有的方法吗?

解决方案 »

  1.   

    因为你在定义时,hand是一个对象指针,不是一个Thread句柄。可以使用hand->m_hThread获得线程句柄,即改为SuspendThread(hand->m_hThread)。
      

  2.   

    请大家把问题看完,分清提问的重点。
    第五个写漏了(5)CreateThread也是创建进程它与AfxBeginThread和_beginthreadex函数有什么区别???或者说那些是C++的,WIN32的,MFC的?在MFC里面也可以用所有的方法吗?
      

  3.   

    刚才没仔细看,原来你有好几个问题。
    1、可以不为UNIT。
    2、没看见第2个问题。
    3、已答。
    4、可以。
    5、_beginthreadex是MFC专有的,CreateThread是WIN32的。MFC里可以直接使用WIN32的API。
      

  4.   

    _beginthreadex是MFC专有的?
    这个是C++运行库的吧。
      

  5.   

    TO楼上:标准C++里根本没有多线程。
    另:hand->SuspendThread(..)也可以挂起。
      

  6.   

    指针和句柄是不同的,一般不能这样转换。各个函数返回值的含义在MSDN中有说明。
      

  7.   

    _beginthreadex 是标准C库里面的!
      

  8.   

    (1)这里为什么返回必须是uint????? 
    ======================
    这里线程函数模型的定义,一般为UINT,否则编译通过不了。这个关键和AfxBeginThread的函数定义有关。
    (2)为什么这里创建的两个线程都没有挂起来,而是直接就执行了???? 
    ========================================
    这个看不出来原因,照写法应该是挂起的,而且你在主线程中也没有启动它,这两个线程应该执行不了才对。
    (3)为什么这样也挂不起来?????? 
          hand->SuspendThread();        非要这样(最下面****中是我在搜到的答案,但是还是不懂,) 
    =====================
    这里要明白AfxBeginThread返回的是CWinThread* ,并不是线程句柄,而SuspendThread是一个API,它要求的参数是线程句柄,不是CWinThread指针,同时,也不是你通过类型转换就能达到目的,不过可以用CWinThread中的m_hThread 来用,如SuspendThread(hand->m_hThread);
    (4) hand[i]=_beginthreadex(NULL,0,threadwork,(void *)i,CREATE_SUSPENDED,&ThreadID[i]);可以用 
                      SuspendThread(HANDLE(hand[0]));??????????? 
    =================
    这个理由同上,因为_beginthreadex返回的是线程句柄
    (5)CreateThread也是创建进程它与有什么区别???或者说那些是C++的,WIN32的,MFC的?在MFC里面也可以用所有的方法吗?
    ===============
    C++本身只是语言,它并不负责多线程问题,多线程是系统的事,CreateThread是一个API,由系统实现,_beginthreadex是C语言编译器提供的一个CRT函数。而AfxBeginThread则是MFC专用的,它们在内部都会调用CreateThread