Страница: 1 | 2 |
Вопрос: Нагрузка на проц в циклах
Добавлено: 09.04.10 10:08
Автор вопроса: Spiritsun
Ответы
Всего ответов: 26
Номер ответа: 16
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #16
Добавлено: 14.04.10 09:11
Еще такой вопрос, вобщемто по теме, т.к. снова натыкаюсь на такой цикл. Что вы используете, если желаете паузу? Есть такая команда api sleep, она не катит, т.к. при её выполнении не работает Timer. Придумал такой вариант:
Создаю переменную boolean, отвечающую за активацию паузы и проворачиваю её в модуле Timer при проверки тек даты:
dtim - тек дата
dtplus - дата с прибавкой времени задержки
timact - true при активации таймера
timok - true - время пришло
И теперь такаяже проблема нагрузки цпу при вечном цыкле в местах Do loop, вернее не вечном, но грузит полюбому.
Номер ответа: 17
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #17
Добавлено: 14.04.10 09:39
Вечные циклы - это быдло-стайл,тоже самое касается задержки через таймер.. Sleep корректно юзать только в отдельных потоках, равно как и задачи, которые требуют ожидания, правильно выносить в отдельные треды. Нужна задержка в основном потоке - воспользуйся толковым советов из ответа №12 и не надо тут изобретать велосипед!
А вообще, по большому счету, все твои проблемы выдуманные и они чаще всего возникают из за неверной архитектуры приложения.
Номер ответа: 18
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #18
Добавлено: 14.04.10 13:33
Угу, дельный совет. Просьба есть. Можеж из какой-нибудь своей программы выдрать кусок в качестве демки по организации потока? А то в инете вечно натыкаюсь на устаревшую инфу. А хелпа не даёт полной картины.
V1RTUOZ, у тебя пример для vba 6.0. При открытии в 9.0 (2008) идёт конвертация и всёравно не работает. Есть свежий пример для новой версии?
Номер ответа: 19
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #19
Добавлено: 14.04.10 15:42
Ладно, кажись нашёл, всем кого еще заинтересует этот вопрос вот ссылки:
http://msdn.microsoft.com/ru-ru/library/ywkkz4s1.aspx
http://msdn.microsoft.com/ru-ru/library/ck8bc5c6(v=VS.90).aspx
Номер ответа: 20
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #20
Добавлено: 14.04.10 17:17
Бьюсь об стену. Поток - это тоже линейная штука и имеет окончание. После окончания сделал цикл на новый запуск потока и такаяже фигня с нагрузкой на цпу. А на счёт задержки, мне главное, чтобы во время задержки работали клавишы отмены запуска и выхода из программы. Eros, вижу ты круто разбираежся, тут у меня явно не такая постройка проги, что там на счёт ManualResetEvent и AutoResetEvent? Как на примере они мне могут помоч?
Номер ответа: 21
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #21
Добавлено: 14.04.10 17:31
Или может кто скажет, вот например, резидентные программы, которые в памяти всё время висят и выполняют свою работу - ониж в вечном цыкле. Они как построены?
Номер ответа: 22
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #22
Добавлено: 14.04.10 18:41
BackgroundWorker - Это туфта.. only students// настоящие джедаи его не юзают... Это всего лишь оболочка над Thread
Чтобы понять как они тебе помогут, ты должен понимать и четко осозновать что такое поток, как он работает и взаимодействует с соновным потом, что такое синхронизация потоков и т.д.. Когда ты это поймешь, ты упрешься в то, что какой то поток должен ожидать какого либо события или действия от другого потока.. и вот тут тебе понядобятся эти вещи:
http://msdn.microsoft.com/ru-ru/library/ksb7zs2x.aspx
Надеюсь, ты понимаешь, что я не смогу тебе рассказать на пальцах всю эту тему... тебе придется самому все это изучать.. Thread, Delegate и все, что с ними связано...
Они построены по тому же самому принципу... Они тупо висят в памяти и ждут какого либо события для начала своей работы. К примеру: В COM-порт пришли данные.. поток проснулся, считал их оттуда, обработал.. и снова уснул или перешел в режим ожидания.. Никаких вечных циклов тут нет..
Номер ответа: 23
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #23
Добавлено: 14.04.10 19:06
Плюс почитай азы...
http://msdn.microsoft.com/ru-ru/library/9xyf641a.aspx
http://msdn.microsoft.com/ru-ru/library/3e8s7xdd.aspx
Номер ответа: 24
Автор ответа:
Spiritsun
Вопросов: 15
Ответов: 44
Профиль | | #24
Добавлено: 14.04.10 20:25
благодарю, посмотрю что можно сделать
Номер ответа: 25
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #25
Добавлено: 14.04.10 21:10
Ты лучше на пальцах объясни что ты пытаешься сделать, что тебе такие извращения понадобились.. Может там все гораздо проще решается..
Номер ответа: 26
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #26
Добавлено: 17.04.10 05:06
Такого не должно быть.
Планировщик должен равномерно загрузить оба ядра на 50%. Если ты, конечно, не устанавливал affinity mask, но я не думаю что ты это делал.