暂停执行没有睡眠的线程?

时间:2011-03-22 18:37:56

标签: multithreading delphi sleep tthread

我正在使用Skype API,它会在每次收到消息时发回消息。我不确定这是否真的 是什么导致它,但它是我能得到的最接近的:当我发送太多消息时,COM控件无法处理所有的回复,这导致它崩溃整个应用程序。当我使用for循环时会发生这种情况。

我正在使用Threads来完成这项工作,所以我的程序不会挂起。我知道我可以在线程中执行Sleep();,并且(应该)不会使整个程序保持睡眠状态。问题是,我的COM控件也会睡觉,所以它仍然无法处理它需要的任何东西,所以它可以再次跟上。

所以,问题是:如何在不暂停整个线程的情况下暂停例程,以便我的COM对象可以处理回复而不会重载?

4 个答案:

答案 0 :(得分:4)

CoWaitForMultipleHandles可用于阻止线程,但仍然可以泵送COM消息(如果是STA),其他一些Windows消息并且超时。听起来像你可以使用的东西。

答案 1 :(得分:1)

我倾向于在这种情况下使用TSimpleEvent。它可能会阻塞你的线程一段时间(超时),但你也可以在外部唤醒你的线程(例如在你的呼叫终止之前)。它不需要CPU。它可能会被其他线程的调用解锁。我将它用于必须表现得像定时一样的线程,例如每隔5秒钟醒来做一些事情。

*)我没有抓住你的确切问题,但是在没有睡觉的情况下暂停线程是我回答的问题。也许它可以用作(解决方案)的一部分。祝你好运。

答案 2 :(得分:0)

听起来线程需要测试它是否应该在每次调用时发送消息,而不是总是发送消息。

如何做到这一点取决于实施;你可能有一些需要满足的条件(一个大小阈值,所以你永远不会发送一个非常小的消息),或者可能通过速率限制(检查最后一条消息是否发送得足够长,你能负担得起另一个)。

我希望这很有帮助;我知道这是非常高级的。

答案 3 :(得分:0)

你可以使用两个线程,一个用于发送,一个用于接收,并将它们锁定为in this consumer/producer example(“与Delphi中的受保护块的线程同步”,适用于Delphi 2009及更高版本) ,那么新的消息只能由消费者处理消费者时发送?