代码之家  ›  专栏  ›  技术社区  ›  Akaanthan Ccoder

在线程中,如果设置为无穷大,则waitformultipleobjects永远不会返回

  •  1
  • Akaanthan Ccoder  · 技术社区  · 16 年前

    假设我有三个线把手

    HandleList[0] = hThread1;
    HandleList[1] = hThread2;
    HandleList[2] = hThread3;
    /*All the above are of type HANDLE*/
    

    在关闭应用程序之前,我希望线程完成其任务。所以我想让应用程序等待线程完成。

    我这样做了,

    WaitForMultipleObjects(3, HandleList, TRUE, INFINITE );
    

    这样我就可以制作线程,完成它的任务。但是,不管所有线程完成任务,控件都不会在调用WaitForMultipleObjects后移到下一行。

    如果我使用,一些秒而不是无限秒,它会在这许多秒之后到达下一行,不考虑线程是否完成了它的任务。

    WaitForMultipleObjects(3, HandleList, TRUE, 10000 );
    

    我这里的问题是,我不能走几秒钟,因为我可能不确定线程是否会在给定的时间内完成它的任务。

    用简单的词列出我的问题, 在关闭应用程序之前,我希望所有线程都能完成任务。如何使用WaitForMultipleObjects API实现它?

    编辑: 按MSDN。

    DWM毫秒 [in]超时间隔,以毫秒为单位。

    • 即使不满足bwaitall参数指定的条件,如果间隔已过,则函数返回。
    • 如果dwmillises为零,函数将测试指定对象的状态并立即返回。
    • 如果dwmillises是无限的,则函数的 超时间隔永不消逝 .
    3 回复  |  直到 16 年前
        1
  •  2
  •   Lasse V. Karlsen    16 年前

    简单的答案是你 不能 使用WaitForMultipleObjects实现这一点。

    这里的问题是故障不在这个功能上,它正在做 确切地 它应该做的是等待线程完成。

    这里的问题是一个或多个线程 永不完成 .

    和 那个 是你需要解决的问题。为什么丝线没用完?

    他们陷入僵局了吗?它们是不是在一个没有脱离的循环中运行?

        2
  •  3
  •   Sergey Podobry    16 年前

    您应该向所有线程发出信号,以使用setevent或其他方法完成作业。一定不要等待自己。

        3
  •  2
  •   anon    16 年前

    在你的代码中你说:

    WaitForMultipleObjects(3, HandleList, TRUE, INFINITE );
    

    直到三个线程都完成。这就是你想要的吗?如果要等到其中任何一个完成,请执行以下操作:

    WaitForMultipleObjects(3, HandleList, FALSE, INFINITE );
    

    如果第一个版本永远不会返回,那么这是因为至少有一个线程永远不会终止。您可能还想了解在API文档中创建窗口的线程的限制条件,网址为 http://msdn.microsoft.com/en-us/library/ms687025%28VS.85%29.aspx .