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里面也可以用所有的方法吗?
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里面也可以用所有的方法吗?
第五个写漏了(5)CreateThread也是创建进程它与AfxBeginThread和_beginthreadex函数有什么区别???或者说那些是C++的,WIN32的,MFC的?在MFC里面也可以用所有的方法吗?
1、可以不为UNIT。
2、没看见第2个问题。
3、已答。
4、可以。
5、_beginthreadex是MFC专有的,CreateThread是WIN32的。MFC里可以直接使用WIN32的API。
这个是C++运行库的吧。
另:hand->SuspendThread(..)也可以挂起。
======================
这里线程函数模型的定义,一般为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