Родились сегодня:
lSemperFi


Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

391

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Советник

379

Россия, Санкт-Петербург


ID: 401888

puporev

Профессор

215

Россия, Пермский край


ID: 400669

epimkin

Профессионал

111


ID: 405338

vovaromanov.jr

1-й класс

103


ID: 242862

Hunter7007

Мастер-Эксперт

29

Россия, Омск


ID: 137394

Megaloman

Мастер-Эксперт

25

Беларусь, Гомель


8.10.2

13.10.2021

JS: 2.10.2
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-10-27 22:16:01-standard


Создание программ на программной платформе .NET Framework и языках С# и Java.

Администратор раздела: Коцюрбенко Алексей Владимирович (Старший модератор)

Консультация онлайн # 109029

Раздел: .NET Framework / C# / Java
Автор вопроса: Arcady0602
Дата: 12.11.2007, 10:54 Консультация закрыта
Поступило ответов: 3

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

if(ThreadHandle)WaitForSingleObject(ThreadHandle,INFINITE);

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

if(ThreadHandle)break;

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

CloseHandle(ThreadHandle);

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

Приложение:

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

mega

Посетитель
12.11.2007, 11:19
Ответ # 193396 от Geograph
Здравствуйте, Arcady0602!
Можно попробовать обойтись без потоков, двумя простыми функциями, которые будут выполняться последовательно. Хотя не всегда это получается.

Geograph

Посетитель
12.11.2007, 12:33
Ответ # 193506 от PavelGM
Здравствуйте, Arcady0602!

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

PavelGM

Посетитель
12.11.2007, 21:04
Мини-форум консультации # 109029
Нет сообщений в мини-форуме
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 162

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 70

solowey

Академик

Рейтинг: 3

CradleA

Мастер-Эксперт

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0