Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

Народное голосование ПРЕМИИ РУНЕТА-2007!
Голосуем за RusFAQ.ru >>

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 484
от 17.11.2007, 11:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 394, Экспертов: 36
В номере:Вопросов: 1, Ответов: 3


Вопрос № 109029: Здравствуйте. Устанавливаю 2 таймера с разным временем срабатывания. При срабатывании таймеров запускаются 2 разных потоках, которые не могут существовать одновременно, т.к. обращаются к одному ресурсу: последовательному порту. Опрос порта должен...

Вопрос № 109.029
Здравствуйте.
Устанавливаю 2 таймера с разным временем срабатывания. При срабатывании таймеров запускаются 2 разных потоках, которые не могут существовать одновременно, т.к. обращаются к одному ресурсу: последовательному порту. Опрос порта должен работать в отдельных потоках, чтобы в это время был доступен пользовательский интерфейс. Чтобы разрулить эту ситуацию, использую функцию API WaitForSingleObject, которая призывает дождаться завершения одного из потоков, если его дескриптор существует, освободить его дескриптор, открыть другой поток, используя для дескриптора освобождённую переменную ThreadHandle (см. секцию case WM_TIMER). Но при накладках, когда не завершился поток запущенный по одному таймеру, скажем, Timer1, а пришло сообщение WM_TIMER от другого таймера, Timer2, программа виснет на WaitForSingleObject. Если вместо

if(ThreadHandle)WaitForSingleObject(ThreadHandle,INFINITE);

использовать

if(ThreadHandle)break;

тогда непонятно, где делать

CloseHandle(ThreadHandle);

Что не так в логике, как сделать правильно?
Спасибо.

Приложение:

Отправлен: 12.11.2007, 10:54
Вопрос задал: Arcady0602 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: mega
Здравствуйте, Arcady0602!
Я думаю, лучше всего будет отказаться от таймеров, поскольку они синхронизируются очередью сообщений, вместо этого использовать потоки, а таймер генерировать слипом на N мс.(например на секунду: Sleep(1000) ) либо ожиданием внешнего события, типа "аборт", на N мс.(второй вариант корректнее, поскольку позволяет выйти из ожидания преждевременно, например при закрытии программы)
Ответ отправил: mega (статус: 3-ий класс)
Ответ отправлен: 12.11.2007, 11:19

Отвечает: Geograph
Здравствуйте, Arcady0602!
Можно попробовать обойтись без потоков, двумя простыми функциями, которые будут выполняться последовательно. Хотя не всегда это получается.
Ответ отправил: Geograph (статус: 2-ой класс)
Ответ отправлен: 12.11.2007, 12:33

Отвечает: PavelGM
Здравствуйте, Arcady0602!

В такой схеме стоило бы использовать вместо Wait-INFINITE - цикл и интервал напрммер WaitForSingelObject c 1000 и устанавливать флаг нахождения в данном цикле, тогда приход второго таймера можно просто игнорировать или "отложить" (используя например PostMessage), если флаг сообщает о нахождении в цикле освобождения первого потока по первому таймеру. Надеюсь идея понятна :).
Ответ отправил: PavelGM (статус: Студент)
Ответ отправлен: 12.11.2007, 21:04


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.62.1 от 14.11.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное