Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2013, 16:05   #1
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию Паритет потока от таймера

Здравствуйте
Я обычно использую в качестве потоков обработчики таймеров, и мне нужно осуществить в таком потоке вечный цикл по отношению существования программы.
Вот его код на vb.net:

While Not ((Now.Day = NextMasurement.Day) And (Now.Month = NextMasurement.Month) _
And (Now.Year = NextMasurement.Year) And (Now.Hour = NextMasurement.Hour) _
And (Now.Minute = NextMasurement.Minute) And (Now.Second = NextMasurement.Second))
If TimeRunThread = -1 Then Exit Sub
End While

Таймер вызывает только один раз этот callback, но при его работе почему то процессор загружается на 50% не пойму причин для этого.
Now - структура с системным временем
NextMasurement - структура
Он мне нужен только для проверки условия NextMasurement =Now
wanes101 вне форума Ответить с цитированием
Старый 10.07.2013, 19:51   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Любой вечный цикл будет целиком грузить то ядро, на котором выполняется. Это нормально, ведь там непрерывно выполняются инструкции (даже если в теле цикла ничего не делается). Если у вас двухъядерный процессор (а так видимо и есть), то будет загружено 50% - одно ядро.
Проблему можно решить, поставив например Thread.Sleep(1) после каждой итерации - это разгрузит поток. Ну или другое время укажите, в миллисекундах.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 10.07.2013, 20:23   #3
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

Как минимум каждая windows программа должна иметь один вечный цикл, к примеру допустим
while GetMessage(Msg,0,0,0)
TranslateMessage(Msg)
DispatchMessage(Msg)
end while

Это пример WinMAin процедуры любого WindowsForm приложения, и значит там тоже используется Sleep?

За решение проблемы спасибо
wanes101 вне форума Ответить с цитированием
Старый 10.07.2013, 20:27   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Так как GetMessage блокирует выполнение вашего кода до следующего windows сообщения, то логично предположить, что внутри оно делает почти то же самое)
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
запуск потока из таймера, как? buket Общие вопросы Delphi 6 16.12.2011 11:36
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
Запуск таймера из потока (delphi 2010) Terikon Общие вопросы Delphi 10 07.08.2010 18:09