线程挂不起来
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里面也可以用所有的方法吗?