关于MFC中使用WaitForMultipleObjects等待所有线程结束?

cser5201 2014-04-23 04:21:20
我在网上找了关于等待所有线程结束的方法,其中有的帖子提到了使用WaitForMultipleObjects函数,可我在我的程序上使用该函数起不到相应的效果,求个位大神帮助啊。
代码是这样:
UINT CScanDlg::PortScan()
{
int port[60] = {0};
PortArrSet(port);
DWORD dwThrdParam;
CWinThread *pA = NULL;
HANDLE handle[60] = {0};

for(int i = 0; i < 60; i++)
{
dwThrdParam = (DWORD)port[i];
pA = AfxBeginThread(ThreadPortScan, &dwThrdParam);
handle[i] = pA->m_hThread;
Sleep(1);
}

WaitForMultipleObjects(60, handle, TRUE, INFINITE);
Sleep(1);
return 0;
}
...全文
664 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小爬虾 2014-04-25
  • 打赏
  • 举报
回复
http://blog.csdn.net/lyd_253261362/article/details/4450202 希望对你有帮助。
cser5201 2014-04-23
  • 打赏
  • 举报
回复
引用 9 楼 VisualEleven 的回复:
你Debug调试一下你的线程函数,看看卡在哪里,为啥没有返回?
新建的线程有点多,单步调试搞得好乱,能加你QQ和你讨论一下么?
Eleven 2014-04-23
  • 打赏
  • 举报
回复
你Debug调试一下你的线程函数,看看卡在哪里,为啥没有返回?
cser5201 2014-04-23
  • 打赏
  • 举报
回复
照我自己之前的写法··我使用getlasterror后~得出的错误是句柄无效,可是不懂怎么解决啊…………
cser5201 2014-04-23
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
[quote=引用 5 楼 u014799813 的回复:] [quote=引用 4 楼 VisualEleven 的回复:]
#define MAX_THREAD_COUNT (60)
HANDLE hThread[MAX_THREAD_COUNT ] = {0};
CWinThread* pThread[MAX_THREAD_COUNT] = {0};
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
  pThread[i] = AfxBeginThread(ThreadPortScan, ... , CREATE_SUSPENDED, ...);
  pThread->m_bAutoDelete = FALSE;
  hThread[i] = pThread[i]->m_hThread;
  pThread[i]->ResumeThread();
}

WaitForMultipleObjects(MAX_THREAD_COUNT, hThread, TRUE, INFINITE);
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
 CloseHandle(hThread[i]);
 hThread[i] = NULL;
  delete pThread[i];
 pThread[i] = NULL;
}
这样写后程序直接锁死了~怎么回事?[/quote] 那的看你的线程函数中写了些什么?[/quote] 函数是这个 UINT ThreadPortScan(LPVOID lp) { timeout.tv_sec = 1; //定义超时时间 int retal = 0; SOCKET sockfd; sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd == INVALID_SOCKET) { return 0; } unsigned long arg = 1; retal = ioctlsocket(sockfd, FIONBIO, &arg); sockaddr_in des; des.sin_family = AF_INET; des.sin_addr.s_addr =inet_addr(HostAddr); int Port = *(int*)lp; //传递的是端口号 des.sin_port = htons(Port); connect(sockfd, (struct sockaddr *)&des, sizeof(des)); FD_ZERO(&mask); FD_SET(sockfd,&mask); retal = select(0, NULL, &mask, NULL, &timeout); if((retal == 0) || (retal == -1)) { closesocket(sockfd); } else { closesocket(sockfd); char buf[100]; sprintf(buf, "端口%d为开放状态", Port); m_pDlg->PrintInfo(buf);//打印信息 } return 0; } 我用VC调的··
Eleven 2014-04-23
  • 打赏
  • 举报
回复
引用 5 楼 u014799813 的回复:
[quote=引用 4 楼 VisualEleven 的回复:]
#define MAX_THREAD_COUNT (60)
HANDLE hThread[MAX_THREAD_COUNT ] = {0};
CWinThread* pThread[MAX_THREAD_COUNT] = {0};
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
  pThread[i] = AfxBeginThread(ThreadPortScan, ... , CREATE_SUSPENDED, ...);
  pThread->m_bAutoDelete = FALSE;
  hThread[i] = pThread[i]->m_hThread;
  pThread[i]->ResumeThread();
}

WaitForMultipleObjects(MAX_THREAD_COUNT, hThread, TRUE, INFINITE);
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
 CloseHandle(hThread[i]);
 hThread[i] = NULL;
  delete pThread[i];
 pThread[i] = NULL;
}
这样写后程序直接锁死了~怎么回事?[/quote] 那的看你的线程函数中写了些什么?
cser5201 2014-04-23
  • 打赏
  • 举报
回复
引用 4 楼 VisualEleven 的回复:
#define MAX_THREAD_COUNT (60)
HANDLE hThread[MAX_THREAD_COUNT ] = {0};
CWinThread* pThread[MAX_THREAD_COUNT] = {0};
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
  pThread[i] = AfxBeginThread(ThreadPortScan, ... , CREATE_SUSPENDED, ...);
  pThread->m_bAutoDelete = FALSE;
  hThread[i] = pThread[i]->m_hThread;
  pThread[i]->ResumeThread();
}

WaitForMultipleObjects(MAX_THREAD_COUNT, hThread, TRUE, INFINITE);
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
 CloseHandle(hThread[i]);
 hThread[i] = NULL;
  delete pThread[i];
 pThread[i] = NULL;
}
这样写后程序直接锁死了~怎么回事?
Eleven 2014-04-23
  • 打赏
  • 举报
回复
#define MAX_THREAD_COUNT (60)
HANDLE hThread[MAX_THREAD_COUNT ] = {0};
CWinThread* pThread[MAX_THREAD_COUNT] = {0};
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
  pThread[i] = AfxBeginThread(ThreadPortScan, ... , CREATE_SUSPENDED, ...);
  pThread->m_bAutoDelete = FALSE;
  hThread[i] = pThread[i]->m_hThread;
  pThread[i]->ResumeThread();
}

WaitForMultipleObjects(MAX_THREAD_COUNT, hThread, TRUE, INFINITE);
for(size_t i = 0; i != MAX_THREAD_COUNT; ++i)
{
 CloseHandle(hThread[i]);
 hThread[i] = NULL;
  delete pThread[i];
 pThread[i] = NULL;
}
cser5201 2014-04-23
  • 打赏
  • 举报
回复
我使用了这个函数来等待线程,可是每次线程都没有结束完该函数就执行了,苦恼了一天啊!
cser5201 2014-04-23
  • 打赏
  • 举报
回复
这个是个端口扫描函数,针对每个不同的端口我都开了个线程……
aegeanzorro 2014-04-23
  • 打赏
  • 举报
回复
在线程入口函数中使用啊~你这个是什么函数

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧