|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
25.09.2012, 17:56 | #1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Контролируемый Sleep потока.
Доброго времени суток!
Имеется поток(TThread в Delphi, навесной класс для CreateThread из набора функций винды). Поток работает от начала старта программы и до её завершения, без перерыва и остановок(Suspend, Resume). Проблема в том, что серверу нужно отдохнуть от запросов т.к. программа будет популярна и сис. админы будут отдавать сотни ненависти к тому, кто дал юзерам возможность засорять канал сервера постоянной передачей POST|GET запросов с 50% возможностью получения одной и той же инфы в течении 30 сек. Чтобы такого не было, было принято автоматом тормозить поток при помощи Sleep на N секунд(минимально 60 сек). И этого помогло. Однако, поток работает постоянно, и если юзер решает её закрыть(программу), то программа вешается, т.к. ждет, пока поток выспится, и прыгнет в условие: Код:
Как прервать спячку потока и завершить его? |
25.09.2012, 18:26 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Заменить длинный sleep на серию коротких в цикле и там проверять terminated. Не надеяться на точность отсчета времени и в цикле еще системное время проверять, что бы закончить его через заданное к-во секунд
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
25.09.2012, 19:41 | #3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Не вариант. Нужно редактировать время сна.
|
25.09.2012, 19:42 | #4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
я бы слип заменил на
Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
25.09.2012, 20:00 | #5 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
25.09.2012, 22:01 | #6 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
veniside, вариант, НО работать так же должно как sleep. Имеется ввиду автономно, без внешнего "Да ты, сейчас можешь спать", и одновременно из вне с "Ты должен сейчас повесится".
Вот кусок кода, где нужно усыплять поток: Код:
Последний раз редактировалось Человек_Борща; 25.09.2012 в 22:09. |
25.09.2012, 23:08 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Что плохого в циклах?
|
26.09.2012, 00:14 | #8 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Плохо то, что общее время простоя, с каждой интерацией, цикла будет больше... Итого, когда цикл от 1 до 60,достигнет 60-го витка, поток, в общем, проспит 11 925 446 милисекунд, когда надо всего-то 60 000 мс.
|
26.09.2012, 06:49 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
|
26.09.2012, 08:32 | #10 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Откуда 11 925 446? Почти те же 60 000. Большая точность здесь ни к чему. Если уж надо, то цикл WHILE или REPEAT и в теле цикла контролировать время прошедшее с начала цикла, хотя не думаю что точней на много получится
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 26.09.2012 в 08:43. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 | BEL9ILLI | Общие вопросы Delphi | 3 | 06.12.2011 20:26 |
Sleep в потоке | Florento | Общие вопросы Delphi | 13 | 21.06.2011 21:54 |
Как узнать номер потока из самого потока? | GaMeSTeR | Помощь студентам | 0 | 03.12.2010 09:50 |
Sleep(50); за 63 мс... или за 47... | Teksa | Общие вопросы C/C++ | 8 | 20.07.2010 08:34 |
контролируемый ввод | Kandela | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 20.05.2008 23:32 |