我有一个线程:
DWORD WINAPI ThreadFunction(LPVOID lpParam){...}在主线程中,我通过以下方式创建了N了线程:
const int MAX_THREAD = 10;HANDLE hThread[MAX_THREAD];
for(int i = 0; i < MAX_THRAD; i ++)
{
// Data[i] 是需要传递的线程参数数据,为一结构struct类型数据
hThread[i] = CreateThread( NULL, 0, ThreadFunction, (LPVOID*)&Data[i], 0, NULL);
}现在要实现的是对这10个线程的周期调度,比如按照10秒的周期调度,改如何处理?
个人目前所能想到的方案有两种:
1。在ThreadFunction()外部实现周期调度,即在主线程中实现周期调度
2。在ThreadFunction()内部部实现周期调度,即:
DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
...
while(1)
{
// 过一周期
DoSomething();
}
}
大家参考一下,使用什么方式好,同时在实现周期调度时,使用什么技术,比如Event,Timer等,请详细说明,最好给出示例代码,不胜感激!
DWORD WINAPI ThreadFunction(LPVOID lpParam){...}在主线程中,我通过以下方式创建了N了线程:
const int MAX_THREAD = 10;HANDLE hThread[MAX_THREAD];
for(int i = 0; i < MAX_THRAD; i ++)
{
// Data[i] 是需要传递的线程参数数据,为一结构struct类型数据
hThread[i] = CreateThread( NULL, 0, ThreadFunction, (LPVOID*)&Data[i], 0, NULL);
}现在要实现的是对这10个线程的周期调度,比如按照10秒的周期调度,改如何处理?
个人目前所能想到的方案有两种:
1。在ThreadFunction()外部实现周期调度,即在主线程中实现周期调度
2。在ThreadFunction()内部部实现周期调度,即:
DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
...
while(1)
{
// 过一周期
DoSomething();
}
}
大家参考一下,使用什么方式好,同时在实现周期调度时,使用什么技术,比如Event,Timer等,请详细说明,最好给出示例代码,不胜感激!
解决方案 »
- 右键菜单
- VC中如何使用判定某一个文件是否存在的Win API函数?
- 菜鸟问题~!ShellExecute怎么样打开指定路径的文件
- 请问如何判断cstring中包含一个子串
- 请问怎样创建一个自定义位图并显示出来?
- 有没有分割窗体的源代码,给一份,最好是个完整的实例
- 哪里有MSDN的简体中文版下载??
- 基于TCP的echo服务器,哪里有现成的?
- 提供能够播放几乎所有图片格式的源程序!
- 怎么让控件一直在中间显示?
- win98explorer删除文件进回收站是用哪个函数啊,小弟我钩了shfileoperation (包括A, W)三个函数都没有.
- 请问在Win32中,怎样像在MFC中一样映射单击菜单事件?
CreateTimer
然后在OnTimer里面SetEvent2 内部:
你现在的循环方法就不错,再加上一个WaitForSingleObject来响应外部通知就可以了。
而且这个Event必须是ManualReset=FALSE的吧,
如果每个线程都要对应一个Event,是不是感觉上不是很爽啊,
不过我目前用的就是这种方案,因感觉不爽,所以才向大家求教啊:)向你所说的"用一个线程专门负责调度",如果可行,能不能给个雏形出来,多谢哈!!!
你说:"外部用Event应该是一个最好的选择",如果这样的话,是不是每次都要创建线程了吧,如下:
for(...) {
CreateThread(...);
}
而且这样的话,当每个线程执行内部操作DoSomething()时,肯定与设定的启动周期在时间上有所差异了,所以,感觉还是不尽人意.2 内部:
你说:"再加上一个WaitForSingleObject来响应外部通知就可以了"
这样的话,为了能使这10个线程都能在同一周期时间启动,我所能实现的还是需要10个Event了,不知仁兄能否使用一个Event同时调度10个线程在统一时间周期同时运转?
谢谢!!!
你说:"做十个event.定期setevent"
我目前真是按照这种思路实现的,但要用10个Event从心里感觉不是很爽哈,呵呵,如果线程在多点,Event也要跟着增多啊.
有没有使用一种内核对象,实现多个线程同周期调度的可能,还望有劳大家啦.谢谢!!!
如果非要,你在主线程中搞个Timer,首先supsend所有的线程,10秒以后resume下一个,suspend前一个。
呵呵,我是想让这10个线程每隔10秒中都执行一次.
还有啦,在主线程中如果要suspend这些线程,何时suspend,何时resume?
suspend时,怎么知道线程中的dosomething一定结束了?
谢谢啊!!!
你不是10秒间隔吗?>>怎么知道线程中的dosomething一定结束了?
这个就要用其他方法了。例如线程独有的一个标志等。结束了线程设置这个标识。主线程检查。或者直接退出,然后在主线程中,windows有个API可以通过线程句柄得到它的状态,返回一个什么标识线程已经结束了。
也就是说设置一个线程为一个纤程来调度你想要的函数。
具体参看MSDN的API说明:ConvertThreadToFiber() etc
主线程:
g_hsem = CreateSemaphore(NULL, 0, MAXLONG, NULL);被调度线程:
while (true) { WaitForSingleObject(g_hsem, INFINITE);
dothing();
}
调度线程: ReleaseSemaphore(g_hsem, 10, NULL);