Приостановка выполнения темы без сна? - PullRequest
2 голосов
/ 22 марта 2011

Я использую Skype API, который отправляет сообщение каждый раз, когда его получает.Я не уверен, что это действительно , что вызывает его, но это самое близкое, что я могу получить: когда я отправляю слишком много сообщений, элемент управления COM не может обработать все ответы, что приводит к сбоювсе приложение.Это происходит, когда я использую цикл for.

Я использую Threads для выполнения работы, поэтому моя программа не зависает.Я знаю, что могу сделать Sleep(); в потоке, и не заставит (не) заставить всю программу спать.Проблема, однако, в том, что мой COM-элемент управления будет работать в спящем режиме, поэтому он по-прежнему не сможет обрабатывать все, что ему нужно, поэтому он сможет снова работать.

Итак, вопрос в том, как я могу приостановить подпрограмма без остановки всего потока, чтобы ответы могли обрабатываться моим COM-объектом без перегрузки?

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

CoWaitForMultipleHandles можно использовать для блокировки потока, но все же перекачивать сообщения COM (в случае STA), некоторые другие сообщения Windows и имеет время ожидания. Звучит как то, что вы могли бы использовать.

1 голос
/ 22 марта 2011

Я склонен использовать TSimpleEvent для таких случаев.Он может заблокировать ваш поток на определенное время (тайм-аут), но вы также можете разбудить его с внешним миром (например, прямо перед завершением вызова).Это не стоит процессора.Это может быть разблокировано вызовами из других потоков.Я использую это для потоков, которые должны вести себя так, как если бы они были синхронизированы, например, просыпаться каждые 5 секунд и что-то делать.

*) Я не понимаю вашей точной проблемы, но приостановка в потоках без снов - вот чтоЯ ответил на.Может быть, это может быть использовано как (часть) вашего решения.Удачи с этим.

0 голосов
/ 30 марта 2011

Не могли бы вы использовать два потока, один для отправки, другой для получения, и заблокировать их как в этом примере для потребителя / производителя (" Синхронизация потоков с защищенными блоками в Delphi ", для Delphi 2009 и более поздних версий), так что новое сообщение может быть отправлено производителем только после его обработки потребителем?

0 голосов
/ 22 марта 2011

Похоже, поток должен проверить, должен ли он отправлять сообщение при каждом вызове, а не отправлять его всегда.

Как это сделать, зависит от реализации;у вас может быть какое-то условие, которое должно быть выполнено (пороговое значение размера, поэтому вы никогда не отправляете сообщение, которое является слишком маленьким), или, возможно, с помощью ограничения скорости (проверьте, достаточно ли последнего сообщения отправлено достаточно давно, что вы можете позволить себе отправитьдругое).

Надеюсь, это полезно;Я знаю, что это очень высокий уровень.

...