我每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
后转到等待状态,因为内存中的活动线程数将呈指数级增长,可能我应该这样做计时器,但我认为我可以更好地管理频率。
我还尝试使用线程计数器(告诉活动线程数),如果计数器大于零,则从回调函数返回,根据我的理解,这不是线程安全的。
我应该怎样做以保持一个线程只在任何时间运行,例如,如果线程无法获取互斥锁,那么它应该终止而不是等待。
答案 0 :(得分:2)
根据您的描述和附加说明,您可以执行以下操作:
有:
CreateEvent
创建)处理线程将有一个大的无限for(;;)
循环,它通过等待事件开始,然后进行所需的处理。 timer事件,而不是每50ms触发一个新线程,只需调用SetEvent
来触发处理线程。
这样,您不能同时拥有多个“处理器”。如果持续时间超过50毫秒,则将其丢弃。
如果每个事件需要超过50毫秒才能继续,您可以拥有多个处理线程+事件,并且可以通过循环方式从计时器中触发它们(循环通过它们)。
答案 1 :(得分:2)
在我看来,你违反了最基本的线程原则之一(虽然@Dim的答案是改进,但它仍然在做同样的事情)。要记住的最重要的一点是线程应尽可能独立运行。理想情况下,您希望最大程度地减少线程之间的同步和通信,以使它们完成工作所需的最小值。
在这种情况下,最小值似乎是"无"。主线程必须创建工作线程。在那之后,你所描述的一切都不需要任何进一步的沟通。
至少据我所知,这里的意图是工作线程以50 ms的间隔进行某种处理。假设这是正确的,你似乎完全没有让UI线程参与其中。相反,您应该有一个(并且只有一个)工作线程启动,并在循环中执行以下操作:
虽然你还没有描述过它,但是我在这里看到(可能)需要进行线程间通信的唯一地方就是这个工作线程告诉UI线程完成了一轮处理,并且UI可以使用数据来更新UI。我不知道你的情况采用什么形式(可能根本不需要),但我至少可以看到可能需要的地方。然而,简单地让线程每50毫秒执行一次,并不足以证明进行任何类型的线程间通信(更不用说每50毫秒创建一个新线程的开销,然后添加更多开销来确保你一次只有一个工作线程)。