【问题标题】:Check if thread is running检查线程是否正在运行
【发布时间】:2011-02-17 15:34:27
【问题描述】:

当我声明一个句柄时

HANDLE hThread;

我检查线程是否正在运行,

  if (WaitForSingleObject(hThread, 0) == WAIT_OBJECT)
  {
       //Thread is not running.
  }
  else
  {
       hThread = CreateThread(......)
  }

但第一次检查线程是否正在运行时失败。如何做呢?我认为我唯一需要的就是以某种方式将hThread 设置为信号状态。

编辑

我发现了类似的东西

hThread = CreateEvent(0, 0, 1, 0); //sets to handle to signaled

你同意吗?

【问题讨论】:

  • 由于 C99 缺少线程库,乍一看这与为 C1x 提议的线程库完全不同,请添加平台或库标记。
  • 如果您想要有意义的建议,您必须描述您的问题所在。我会评论说您正在创建一个基本上不起作用的自动重置事件。一个事件可能是你问题的解决方案,但你还没有说你的问题是什么。您的第一行代码段是错误的,因为在创建对象之前您不能调用 WaitForSingleObject,因此我的回答是。在您开始自助并解释您的目标之前,我们无法帮助您。
  • @David 我认为从代码中可以清楚地看到,如果它尚未运行,我想创建一个线程。我将通过按下按钮控件来创建它。
  • 这不是很清楚。无论如何,您不需要事件,答案已经告诉您该怎么做。
  • 我已经更新了我的答案,以更明确地解决您的评论所阐明的问题。

标签: c windows multithreading winapi


【解决方案1】:

看来您实际上并不想测试线程是否完成,而是想知道它是否已启动。你通常会这样做:

HANDLE hThread = NULL;//do this during initialization
...
if (!hThread)
   hThread = CreateThread(......);

一旦您知道它已经开始(hThread 而不是NULL),那么您可以使用您已经知道的WaitForSingleObject 方法或GetExitCodeThread 来测试它是否已完成。

【讨论】:

    【解决方案2】:

    您的线程句柄未初始化。你不能在垃圾句柄上使用WaitForSingleObject()。您是否试图告知之前创建的线程的状态,如果它已经死亡则重新启动它?然后你需要跟踪第一个线程句柄。

    【讨论】:

    • 因此,最好始终将未初始化的 HANDLE 设置为 NULL,然后在使用它们之前检查它们是否为 NULL。 CreateThread 等函数在失败时返回 NULL。
    【解决方案3】:

    你的意思可能是GetExitCodeThread函数。

    编辑。

    hThread = CreateEvent(0, 0, 1, 0); //设置处理信号

    线程完成后,线程句柄会发出信号。这允许使用 Wait* 操作等待线程结束。您的代码创建事件句柄,而不是线程。

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2015-05-28
      相关资源
      最近更新 更多