Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Приостановка и возобновление потоков в Delphi  (Прочитано 13608 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Maestro
Гость
« : 02-06-2006 06:27 » 

При создании потока возникла такая проблема: мне необходимо, чтобы мой поток периодически останавливался и возобновлялся (интервал времени задается пользователем). Я пробовал создать таймер и управлять потоком оттуда, но поток, однажды запущенный, не хочет останавливаться (однако методы Suspend и Resume, привязанные к кнопкам, работают исправно).
Пробовал ставить внутри метода Execute циклы для задержки, но компьютер подвисает. Подскажите, пожалуйста, метод, с помощью которого можно периодически "отсоединять" поток от процессора так, чтобы система не тормозила.
« Последнее редактирование: 05-04-2009 16:34 от Ghost » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #1 : 02-06-2006 07:31 » 

Юзай WaitForSingleObject для остановки, к примеру, на событии (CreateEvent, SetEvent, ResetEvent).
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 02-06-2006 08:58 » 

сказать потоку Suspend не проблема. проблема в том, чтобы сказать ему потом Resume, потому что из самого потока это сделать не удасться Улыбаюсь

тут есть два варианта. во-первых, управлять потоков внешне, из программы или из другого потока, который по команде запускает и останавливает его. во-вторых, в сам потоке организовать проверку некоего флага, типа

  if DoJob then begin
    ...
  end else
    Application.ProcessMessages;

таким образом, взводя и сбрасывая флаг DoJob, можно заставить поток делать или не делать какую-то полезную работу. (сомневаюсь, насчёт ProcessMessages, они там не нужны, скорее всего, это больше для "полноты картины")
Записан

SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 04-04-2009 14:38 » 

Just in Thread's Execute method do sleep(1000). ))) Simple and strong)
Записан

почувствуй радость творческих мук!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-04-2009 14:43 » 

SEA, полнее можно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 09-04-2009 17:26 » 

Для того, чтобы внутри потока работающий бесконечный цикл не вешал машину, создай там в теле цикла задержку, "засыпание" потока. Вот, например:
Код:
while true do //бесконечный цикл в теле твоего потока
begin
  something(); //выполняем некоторые действия...
  somethingyet(); //выполняем еще некоторые действия... Все, что тебе нужно.
 
  sleep(1000);//усыпляем поток на 1 секунду = 1000 мс. Пока поток будет "спать", выполнятся другие задачи других потоков...
end;

Записан

почувствуй радость творческих мук!
SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 09-04-2009 17:45 » 

Во, в тему: вместо sleep(1000) пишешь туда тот интервал, который задал пользователь.
Записан

почувствуй радость творческих мук!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #7 : 10-04-2009 03:28 » 

достаточно даже Sleep(1) , чтобы заметно разгрузить процессор. (Хотя, это равнозначно ~ Sleep(16) , меньше пауза делаться не желает)
Записан

SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 10-04-2009 18:21 » 

Я тестировал - у меня стабильно наименьший слип - 41. )))
Записан

почувствуй радость творческих мук!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines