//基本代码如下:本人刚学VC,代码不合适请指出,谢谢!
//stdafx.h//=============================//
UINT TestThread(LPVOID n);
class ThreadInfo
{
public:
int ThreadId;
};
//mymain.cpp //=============================//
#include "stdafx.h"HANDLE m_hEventStop;
HANDLE m_hEventStopeds[3];
ThreadInfo *ThreadInfos[3]; //线程信息组
CWinThread* tThreads[3]; //线程组int main(int argc, char* argv[])
{
m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
for(int i=0;i<3;i++)
{
ThreadInfos[i]=new ThreadInfo();
ThreadInfos[i]->ThreadId=i;
m_hEventStopeds[i]=::CreateEvent(NULL,TRUE,FALSE,NULL);
tThreads[i]=AfxBeginThread(TestThread,(LPVOID)ThreadInfos[i]);
}
::Sleep(200);
printf("\n线程正在执行!\n");
::SetEvent(m_hEventStop);
printf("\n线程将要关闭!\n");
if(WaitForMultipleObjects(3,m_hEventStopeds,true,INFINITE)!=WAIT_OBJECT_0)
printf("\nWaitForMultipleObjects错误!\n");
else
printf("线程正常结束\n");
return 0;
}UINT TestThread(LPVOID n)
{
ThreadInfo *pInfo=(ThreadInfo *)n;
while(true)
{
printf("%d",pInfo->ThreadId);
::Sleep(100);
if(::WaitForSingleObject(m_hEventStop,0)== WAIT_OBJECT_0)
break;
}
::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
printf("\n(关闭线程%d)\n",pInfo->ThreadId);
return 0;
}
//=============================//执行的输出结果差不多每次都是:
012102
线程正在执行!线程将要关闭!(关闭线程1)(关闭线程0)WaitForMultipleObjects错误!
//===================
不明白为什么WaitForMultipleObjects没有等到3个线程的停止事件?
//stdafx.h//=============================//
UINT TestThread(LPVOID n);
class ThreadInfo
{
public:
int ThreadId;
};
//mymain.cpp //=============================//
#include "stdafx.h"HANDLE m_hEventStop;
HANDLE m_hEventStopeds[3];
ThreadInfo *ThreadInfos[3]; //线程信息组
CWinThread* tThreads[3]; //线程组int main(int argc, char* argv[])
{
m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
for(int i=0;i<3;i++)
{
ThreadInfos[i]=new ThreadInfo();
ThreadInfos[i]->ThreadId=i;
m_hEventStopeds[i]=::CreateEvent(NULL,TRUE,FALSE,NULL);
tThreads[i]=AfxBeginThread(TestThread,(LPVOID)ThreadInfos[i]);
}
::Sleep(200);
printf("\n线程正在执行!\n");
::SetEvent(m_hEventStop);
printf("\n线程将要关闭!\n");
if(WaitForMultipleObjects(3,m_hEventStopeds,true,INFINITE)!=WAIT_OBJECT_0)
printf("\nWaitForMultipleObjects错误!\n");
else
printf("线程正常结束\n");
return 0;
}UINT TestThread(LPVOID n)
{
ThreadInfo *pInfo=(ThreadInfo *)n;
while(true)
{
printf("%d",pInfo->ThreadId);
::Sleep(100);
if(::WaitForSingleObject(m_hEventStop,0)== WAIT_OBJECT_0)
break;
}
::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
printf("\n(关闭线程%d)\n",pInfo->ThreadId);
return 0;
}
//=============================//执行的输出结果差不多每次都是:
012102
线程正在执行!线程将要关闭!(关闭线程1)(关闭线程0)WaitForMultipleObjects错误!
//===================
不明白为什么WaitForMultipleObjects没有等到3个线程的停止事件?
解决方案 »
- SetWindowText("字体");//之后为什么托动窗口标题栏的字又变回原来的了?
- MFC中一个非模态对话框下,怎么操作另一个非模态对话框中的CTreectrl控件……
- ActiveX 控件属性问题?先拜谢!!!
- 关于DirectX
- SQL处理日期中的“周”问题--如何查询与指定日期同属一周内的数据?
- 如何用wininet获到google的搜索结果???
- 请问大家哪里有啊!
- 联众军旗管理程序,喜欢下军旗的进来看看,来者有分
- vc如何实现查找二进制文件中的指定字符串
- 如何设置文字的颜色
- 这是个什么错误?fatal error C1853: 'Debug/s2s.pch' is not a precompiled header file created with this compiler
- 更改文件名的API函数
之后主进程都结束了
在return 0 之前 加::Sleep(200);呢?
break;
的WaitForSingleObject 改为 WSAWaitForMultipleEvents用法参考msdn
class ThreadInfo
{
public:
DWORD ThreadId;
};
//mymain.cpp //=============================//
#include "stdafx.h"HANDLE m_hEventStop;
HANDLE m_hEventStopeds[3];
//ThreadInfo *ThreadInfos[3]; //线程信息组
HANDLE tThreads[3]; //线程组 这里保存线程句柄数组
DWORD CALLBACK TestThread(LPVOID n)
{
ThreadInfo *pInfo=(ThreadInfo *)n;
while(true)
{
printf("%d",pInfo->ThreadId);
::Sleep(100);
if(::WaitForSingleObject(m_hEventStop,0)== WAIT_OBJECT_0)
break;
}
::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
printf("\n(关闭线程%d)\n",pInfo->ThreadId);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
m_hEventStop=::CreateEvent(NULL,TRUE,FALSE,NULL);
for(int i=0;i<3;i++)
{
ThreadInfos[i]=new ThreadInfo();
ThreadInfos[i]->ThreadId=i;
//m_hEventStopeds[i]=::CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD dwThreadId;
tThreads[i]=::CreateThread(
NULL,
0,
TestThread,
ThreadInfos[i],
0,
&dwThreadId
);//AfxBeginThread(TestThread,(LPVOID)ThreadInfos[i]);
}
::Sleep(200);
printf("\n线程正在执行!\n");
::SetEvent(m_hEventStop);
printf("\n线程将要关闭!\n");
if(WaitForMultipleObjects(3,tThreads,true,INFINITE)!=WAIT_OBJECT_0) // 这里等待所有线程退出,这样可以确保线程真正退出了才返回
printf("\nWaitForMultipleObjects错误!\n");
else
printf("线程正常结束\n"); system( "pause" );
return 0;
}
DWORD i, dwEvent; // Create two event objects.for (i = 0; i < 2; i++)
{
hEvents[i] = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event object
FALSE, // initial state is nonsignaled
NULL); // unnamed object if (hEvents[i] == NULL)
{
printf("CreateEvent error: %d\n", GetLastError() );
ExitProcess(0);
}
} // The creating thread waits for other threads or processes
// to signal the event objects.dwEvent = WaitForMultipleObjects(
2, // number of objects in array
hEvents, // array of objects
FALSE, // wait for any
INFINITE); // indefinite wait// Return value indicates which event is signaled.switch (dwEvent)
{
// hEvent[0] was signaled.
case WAIT_OBJECT_0 + 0:
// Perform tasks required by this event.
break; // hEvent[1] was signaled.
case WAIT_OBJECT_0 + 1:
// Perform tasks required by this event.
break; // Return value is invalid.
default:
printf("Wait error: %d\n", GetLastError());
ExitProcess(0);
}
只不过你这样在线程中
::SetEvent(m_hEventStopeds[pInfo->ThreadId]);
printf("\n(关闭线程%d)\n",pInfo->ThreadId);
先设置Event,再打印信息,主线程收到最后一个信号,立即就退出了,子线程的打印信息还没来得及显示,把两个语句换个位置看看
本来我要解决的问题是在MFC对话框程序中等待多线程结束的问题,所以写了这个例子,但到现在还没完全弄清楚,开帖重问。