2

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

我正在使用线程来完成这项工作,所以我的程序不会挂起。我知道我可以Sleep();在线程中做,并且不会(不应该)让整个程序休眠。但问题是,我的 COM 控件也将处于休眠状态,因此它仍然无法处理它需要的任何内容,因此它可以再次跟上。

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

4

4 回答 4

4

CoWaitForMultipleHandles可用于阻塞线程,但仍会泵送 COM 消息(在 STA 的情况下)、一些其他 Windows 消息并具有超时。听起来像你可以使用的东西。

于 2011-03-22T21:36:34.097 回答
1

对于这种情况,我倾向于使用 TSimpleEvent。它可能会阻塞您的线程一段时间(超时),但您也可以在外部用它唤醒您的线程(例如,在您调用 Terminate 之前)。它不消耗CPU。它可能会被其他线程的调用解除阻塞。我将它用于必须表现得好像它们是定时的线程,例如每 5 秒唤醒一次并做一些事情。

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

于 2011-03-22T20:13:54.333 回答
0

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

如何做到这一点取决于实现;您可能需要满足某种条件(大小阈值,因此您永远不会发送非常小的消息),或者可能通过速率限制(检查最后一条消息是否在足够长的时间之前发送,您可以负担发送其他)。

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

于 2011-03-22T19:06:00.637 回答
0

您能否使用两个线程,一个用于发送,一个用于接收,并像此消费者/生产者示例中那样锁定它们(“ Delphi 2009 及更高版本中使用受保护块的线程同步”),以便新消息只能是当消费者处理它时由生产者发送?

于 2011-03-29T20:21:15.880 回答