![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можо ли ждать события, но не усыплять поток? [D7, WinXP]
Kolan © (2006-02-22 15:11:00)Здравствуйте,
Если использовать функцию
WaitForSingleObject, то поток уснет и будет ждать пока не случится событие или таймаут...
Есть ли возможность сделать так, чтобы во время ожидания поток не засыпал а делал еще что-то?
Kolan (2006-02-23 20:16:00) [1]Сделал доп поток. Он управляет гл. менеджером...
Events использовал интуитивно. Алгоритм большой и в потоке ему самое место...
Всех благодарю :)
Defunct (2006-02-23 17:34:00) [2]Evgeny V © (23.02.06 07:02) [12]
нельзя не согласиться с тем, что механизм событий Events в части использования в основном потоке будет хуже механизма сообщений.
Поэтому либо доп поток, либо отказ от Events.
Evgeny V (2006-02-23 07:02:00) [3]Повторюсь
> evvcom © (22.02.06 16:48) [8]
> 1. Главный поток оставь для интерфейса
.
добавлю - для получения информации о каких-либо событиях в главном потоке (имеем ввиду оконное приложение, соответственно поток обработки сообщений главной формы) лучше на мой взгляд использовать естественный для этого потока механизм обработки сообщений. А в потоке работы с портом использовать соответственно PostMessage,SendMessage или Synchronize - на ваше усмотрение. Мне больше нравится для информационных сообщений PostMessage.
Defunct (2006-02-23 06:16:00) [4]Kolan © (22.02.06 16:16) [6]
> Уже пакет готов а он все еще ждет тк SetEvent выполняется
> в этом же потоке, а он спит. Это при большом таймауте...
Если все в одном потоке, тогда какой смысл в использовании Events?
можно ведь просто завести булеву переменную... Лучше, конечно, запустить еще один поток.
evvcom (2006-02-22 17:08:00) [5]
> alertable state - "на стрёме")
чистА русский перевод :)
Сергей М. (2006-02-22 17:03:00) [6]
> Kolan © (22.02.06 15:11)
Кодовый поток, вызвавший одну из WaitFor-ф-ций, "отдался во власть режима ядра" - с этого момента ядро ответственно за "жизнь потока".
Поток "заснул". Ядро при этом ответственно как за его "пробуждение" (если поток что-либо ждет), так и за вызов callback-функций в контексте потока (если поток при этом подразумевает alertable state - "на стрёме")
evvcom (2006-02-22 16:48:00) [7]1. Главный поток оставь для интерфейса.
2. Кто такие "менеджеры" и "главный"? Для опроса/получения данных достаточно 1 менеджера и настраиваемое количество рабочих потоков. Менеджера можно реализовать в том же главном потоке, если только он не будет перегружен работой. Если будет, то скорее всего у тебя где-то логическая ошибка. А можно менеджера в доп.потоке реализовать. Как хочешь.
Сергей М. (2006-02-22 16:29:00) [8]
> Есть ли возможность сделать так, чтобы во время ожидания
> поток не засыпал а делал еще что-то?
Нет такой возможности.
Kolan (2006-02-22 16:16:00) [9]Те получается так:
Уже пакет готов а он все еще ждет тк SetEvent выполняется в этом же потоке, а он спит. Это при большом таймауте...
А при маленьком проскакивает не успев дождаться...
Kolan (2006-02-22 16:09:00) [10]Яделаю так.
А разумный таймаут не помогает.... Или проскакивает и говорит что тайм аут или подвисает...
Attempts := 1;
while Attempts
ANB (2006-02-22 15:52:00) [11]Выставлять разумный таймаут. И все делать в цикле.
Kolan (2006-02-22 15:43:00) [12]clickmaker © (22.02.06 15:15) [2]
Так я и знал.
Тогда еще вопрос...
Есть большая и длинная функция(она такая и должна быть), которая должна работать с com портом, нарисовать графики, много еще чего...
Для управления всеми функциями есть менеджеры... А менеджерами управляет главный..
Все это находится в главном потоке...
Внутри функция должна выполнить запросы к Com порту и если недождалась ответов, завершится... Для этого использую
WaitForSingleObject
Так вот проблемма в то, что когда гл. поток засыпает он неможет получить и обработать сообщение, о том, что приняты данные из порта..
Он получает его, только когдаWaitForSingleObjectпрекращается по тайм ауту...
Засунуть ее в другой поток сложно.. тк тогда этому потоку нужно знать о существовании всех используемых менеджеров.. И менеджеры не предназначены для использования несколькими потоками...
Чтобы придумать..
Может сделать поток как-бы самым первым в иерархии, пусть он управляет главным менеджером..
Вообщем что делать? :)
clickmaker (2006-02-22 15:15:00) [13]низзя
нужно что-то делать параллельно - запускай еще один поток
либо в цикле периодически проверять состояние этого самого Object
Fay (2006-02-22 15:14:00) [14]2 Kolan © (22.02.06 15:11)
Так, что-ли ?
while WaitForSingleObject(..., 0) = WAIT_TIMEOUT do
<что-то ещё>