首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
VC/MFC
进程/线程/DLL
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
定时启动N个线程,10分钟内若N个线程都已结束,则重新启动这N个线程,如何实现?
[已结贴,结贴人:ezdevelop]
加为好友
发送私信
在线聊天
ezdevelop
phpsalon.com
等级:
可用分等级:
掌柜
总技术专家分:
2451
总技术专家分排名:
8641
揭帖率:
97.22%
发表于:
2007-11-15 16:00:25
楼主
每天早上1点定时启动N个线程(0 <N <10),线程里处理一些SOCKET R/W。
1) 线程函数
thread_request()
{
while(1) {
SOCKET R/W;
消息循环
}
// 退出条件是收到主界面的WM_THREAD_CANCEL消息或SOCKET ERROR。
}
2) 开启线程
thread_start()
{
std::vector <HANDLE> m_hThreads;
std::vector <CTestThread *> m_vecThreads; // 用于向线程发送WM_THREAD_CANCEL消息
....
CTestThread *pThread;
for (i=0; i <N; i++) {
pThread = (CCnnicThread*)AfxBeginThread(RUNTIME_CLASS(CTestThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
pThread->m_pMainWnd = this;
pThread->something = something;
pThread->PostThreadMessage(WM_THREAD_START, 0, 0);
pThread->ResumeThread();
m_vecThreads.push_back(pThread);
}
}
3) OnTimer
若时间==1点&&m_bIsRunning==FALSE,则启动thread_start,并标记m_bIsRunning=TRUE;
若时间>1点&&时间 <=1点10分&&m_bIsRunning==FALSE,则再次启动thread_start,并标记m_bIsRunning=TRUE;
现在的问题是,我如何在这N个线程都结束后设置m_bIsRunning=FALSE,以便我在1点至1点10分之间再次启动thread_start,因为线程里可能会在这10分钟之前服务器端没开启导致SOCKET ERROR直接退出。
问题点数:
100
回复次数:
13
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ezdevelop
phpsalon.com
等级:
可用分等级:
掌柜
总技术专家分:
2451
总技术专家分排名:
8641
发表于:
2007-11-15 16:07:23
1
楼 得分:
0
我需要在1点10分之后,线程里能够正常进行SOCKET R/W,除非收到WM_THREAD_CANCEL消息。
所以需要在1点至1点10分之间判断,若创建的所有线程已退出,则重新开启这些线程。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
chehw
chehw
等级:
可用分等级:
小地主
总技术专家分:
15916
总技术专家分排名:
860
发表于:
2007-11-15 16:11:55
2
楼 得分:
30
定义一个数据HANDLE hThreads[N];
创建线程时将每个句柄保存至hTreads[i];
在OnTimer中
WaitForMultipleObjects(n, hThreads, TRUE, INFINITE);
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
stivenjia
零度ふ楓
等级:
可用分等级:
中农
总技术专家分:
2435
总技术专家分排名:
8923
发表于:
2007-11-15 16:18:02
3
楼 得分:
10
1.启动线程记录GetSystemTime()->转换为秒单位,记录超时时间为SYSTEMTIME.wMinute+10转换为秒单位
2.在定时器GetSystemTime->转为秒单位>=为SYSTEMTIME 则为超时那么就重新启动线程。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ezdevelop
phpsalon.com
等级:
可用分等级:
掌柜
总技术专家分:
2451
总技术专家分排名:
8641
发表于:
2007-11-15 16:30:01
4
楼 得分:
0
To chehw:
我想过这种方法,但是在OnTimer中调用WaitForMultipleObjects不是阻塞了吗?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
chehw
chehw
等级:
可用分等级:
小地主
总技术专家分:
15916
总技术专家分排名:
860
发表于:
2007-11-15 17:20:49
5
楼 得分:
20
别放在WM_TIMER中, 另开一个线程,
LRESULT WaitThread(LPVOID pv)
{
while(TRUE)
{
WaitForMultipleObjects(n, hThreads, TRUE, INFINITE);
RestartThreads();
}
return 0L;
}
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ezdevelop
phpsalon.com
等级:
可用分等级:
掌柜
总技术专家分:
2451
总技术专家分排名:
8641
发表于:
2007-11-15 17:57:26
6
楼 得分:
0
偶想了另一种方法
1) 在thread_start里记录线程ID
m_vecThreadIDs.push_back(pThread->m_nThreadID);
2) 在thread_request退出的时候发送WM_THREAD_FINISHED消息,并把m_nThreadID传回。
3) 新加一个thread_finished函数用于处理WM_THREAD_FINISHED的消息
m_vecThreadIDs.erase(传回的线程ID)
4) 然后再OnTimer事件里判断是否m_vecThreadIDs为空来确定线程是否执行结束
不知道此方法是否有缺陷
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
msn123321
我心飞扬
等级:
可用分等级:
贫农
总技术专家分:
314
总技术专家分排名:
44621
发表于:
2007-11-15 18:11:21
7
楼 得分:
10
我认为楼上的思路可以啊,我感觉就是如果线程被异常终止,那可能就不会发WM_THREAD_FINISHED消息了,可能要注意这个处理,我比较倾向于用chehw的方法,思路很清晰
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
daidongsheng
Baggio⑩ 想找个游戏开发的工作........:...........
等级:
可用分等级:
富农
总技术专家分:
1394
总技术专家分排名:
14594
发表于:
2007-11-15 20:38:26
8
楼 得分:
10
启动N个线程的时候记录时间
按chehw 的说法:
定义一个数据HANDLE hThreads[N];
创建线程时将每个句柄保存至hTreads[i];
WaitForMultipleObjects(n, hThreads, TRUE, INFINITE);
等上面函数结束 取当前时间,计算时间差判断是不是小于十分钟
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
WingForce
所有人都是蛤蟆,只是井的大小有区别
等级:
可用分等级:
富农
总技术专家分:
9592
总技术专家分排名:
1993
发表于:
2007-11-15 22:15:39
9
楼 得分:
10
恩,如果用等待线程
不再用一个内核定时器,把这个内核定时器句柄和10个线程的句柄都传给WaitForMultipleObjects
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ezdevelop
phpsalon.com
等级:
可用分等级:
掌柜
总技术专家分:
2451
总技术专家分排名:
8641
发表于:
2007-11-16 09:54:01
10
楼 得分:
0
线程个数N是个不定数时该怎么传递呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jameshooo
胡柏华
等级:
可用分等级:
中农
总技术专家分:
47685
总技术专家分排名:
172
2
4
发表于:
2007-11-16 10:31:27
11
楼 得分:
10
WaitForMultipleObjects(n, hThreads, TRUE, 1); 这样就不会阻塞
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
WingForce
所有人都是蛤蟆,只是井的大小有区别
等级:
可用分等级:
富农
总技术专家分:
9592
总技术专家分排名:
1993
发表于:
2007-11-16 13:59:02
12
楼 得分:
0
线程个数N是个不定数时该怎么传递呢?
================================================
其实,在WM_TIMER中不一定需要使用等待线程去wait
可以用GetExitCodeThread获取各个线程的退出码,如果存在STILL_ACTIVE,就说明还有线程没有结束
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhstars
天之痕
等级:
可用分等级:
贫农
总技术专家分:
558
总技术专家分排名:
30447
发表于:
2008-07-06 07:31:32
13
楼 得分:
0
学学习!
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友