我有一个线程:
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等,请详细说明,最好给出示例代码,不胜感激!

解决方案 »

  1.   

    外部用Event应该是一个最好的选择。1 外部:
    CreateTimer
    然后在OnTimer里面SetEvent2 内部:
    你现在的循环方法就不错,再加上一个WaitForSingleObject来响应外部通知就可以了。
      

  2.   

    to: DentistryDoctor(雅克医生<改行做程序员了>)使用Event的话,应该要每个线程都要对应一个Event吧,
    而且这个Event必须是ManualReset=FALSE的吧,
    如果每个线程都要对应一个Event,是不是感觉上不是很爽啊,
    不过我目前用的就是这种方案,因感觉不爽,所以才向大家求教啊:)向你所说的"用一个线程专门负责调度",如果可行,能不能给个雏形出来,多谢哈!!!
      

  3.   

    to: danyueer(淡月儿:清水上的足音)1 外部:
    你说:"外部用Event应该是一个最好的选择",如果这样的话,是不是每次都要创建线程了吧,如下:
    for(...) {
      CreateThread(...);
    }
    而且这样的话,当每个线程执行内部操作DoSomething()时,肯定与设定的启动周期在时间上有所差异了,所以,感觉还是不尽人意.2 内部:
    你说:"再加上一个WaitForSingleObject来响应外部通知就可以了"
    这样的话,为了能使这10个线程都能在同一周期时间启动,我所能实现的还是需要10个Event了,不知仁兄能否使用一个Event同时调度10个线程在统一时间周期同时运转?
    谢谢!!!
      

  4.   

    to: hchinside() 
    你说:"做十个event.定期setevent"
    我目前真是按照这种思路实现的,但要用10个Event从心里感觉不是很爽哈,呵呵,如果线程在多点,Event也要跟着增多啊.
    有没有使用一种内核对象,实现多个线程同周期调度的可能,还望有劳大家啦.谢谢!!!
      

  5.   

    你为什么需要周期调度呢?
    如果非要,你在主线程中搞个Timer,首先supsend所有的线程,10秒以后resume下一个,suspend前一个。
      

  6.   

    to: ilovevc(ilovevc)
    呵呵,我是想让这10个线程每隔10秒中都执行一次.
    还有啦,在主线程中如果要suspend这些线程,何时suspend,何时resume?
    suspend时,怎么知道线程中的dosomething一定结束了?
    谢谢啊!!!
      

  7.   

    》》何时suspend,何时resume?
    你不是10秒间隔吗?>>怎么知道线程中的dosomething一定结束了?
    这个就要用其他方法了。例如线程独有的一个标志等。结束了线程设置这个标识。主线程检查。或者直接退出,然后在主线程中,windows有个API可以通过线程句柄得到它的状态,返回一个什么标识线程已经结束了。
      

  8.   

    楼主还不始用纤程来做更好。!
    也就是说设置一个线程为一个纤程来调度你想要的函数。
    具体参看MSDN的API说明:ConvertThreadToFiber() etc
      

  9.   

    用等待定时器或者信标,根据你说的情况用信标解决应该比较简单
    主线程:
    g_hsem = CreateSemaphore(NULL, 0, MAXLONG, NULL);被调度线程:
    while (true) {    WaitForSingleObject(g_hsem, INFINITE);
        dothing();
    }
    调度线程: ReleaseSemaphore(g_hsem, 10, NULL);