Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можо ли ждать события, но не усыплять поток? [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
 <что-то ещё>


Наверх

Титульная страница Поиск, карта сайта Написать письмо