限制从计时器运行的线程数

时间:2016-04-25 12:40:17

标签: c++ winapi

我每50毫秒触发一次Array ( [0] => Array ( [sys_id] => 8 [sys_title] => Bakery Ordering System [sys_home] => /cp/system/bos/ ) [1] => Array ( [sys_id] => 9 [sys_title] => Checklist [sys_home] => /cp/system/chl/ ) ) 回调函数,在此我创建一个线程只是为了确保ui线程没有阻塞,这些线程在共享内存上操作,我使用 mutex 对象。

我的问题是,当创建新线程并且之前的线程尚未完成时,它们在命中行WM_TIMER后转到等待状态,因为内存中的活动线程数将呈指数级增长,可能我应该这样做计时器,但我认为我可以更好地管理频率。

我还尝试使用线程计数器(告诉活动线程数),如果计数器大于零,则从回调函数返回,根据我的理解,这不是线程安全的。

我应该怎样做以保持一个线程只在任何时间运行,例如,如果线程无法获取互斥锁,那么它应该终止而不是等待。

2 个答案:

答案 0 :(得分:2)

根据您的描述和附加说明,您可以执行以下操作:

有:

  • GUI的一个线程(接收计时器事件)
  • 处理的另一个线程。
  • 事件(使用CreateEvent创建)

处理线程将有一个大的无限for(;;)循环,它通过等待事件开始,然后进行所需的处理。 timer事件,而不是每50ms触发一个新线程,只需调用SetEvent来触发处理线程。

这样,您不能同时拥有多个“处理器”。如果持续时间超过50毫秒,则将其丢弃。

如果每个事件需要超过50毫秒才能继续,您可以拥有多个处理线程+事件,并且可以通过循环方式从计时器中触发它们(循环通过它们)。

答案 1 :(得分:2)

在我看来,你违反了最基本的线程原则之一(虽然@Dim的答案是改进,但它仍然在做同样的事情)。要记住的最重要的一点是线程应尽可能独立运行。理想情况下,您希望最大程度地减少线程之间的同步和通信,以使它们完成工作所需的最小值。

在这种情况下,最小值似乎是"无"。主线程必须创建工作线程。在那之后,你所描述的一切都不需要任何进一步的沟通。

至少据我所知,这里的意图是工作线程以50 ms的间隔进行某种处理。假设这是正确的,你似乎完全没有让UI线程参与其中。相反,您应该有一个(并且只有一个)工作线程启动,并在循环中执行以下操作:

  1. 记录当前时间
  2. 进行处理
  3. 自启动以来剩余的50毫秒(如有必要)
  4. 重复
  5. 虽然你还没有描述过它,但是我在这里看到(可能)需要进行线程间通信的唯一地方就是这个工作线程告诉UI线程完成了一轮处理,并且UI可以使用数据来更新UI。我不知道你的情况采用什么形式(可能根本不需要),但我至少可以看到可能需要的地方。然而,简单地让线程每50毫秒执行一次,并不足以证明进行任何类型的线程间通信(更不用说每50毫秒创建一个新线程的开销,然后添加更多开销来确保你一次只有一个工作线程)。

相关问题