Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?
Поиск
L


Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 8
Всего онлайн: 8
Зарегистрировано юзеров: 5762
Комментариев на сайте: 623
Новый юзер: Sevnday



Последние комментарии
c
N0E0O7 прокомментировал "Урок 1 - Инициализация OpenGL":
А у меня форма чёрная запускается
dimonsky прокомментировал "Урок 2 - Простые примитивы":
GetDC(handle) вместо canvas.handle, и убрать вызов FormResize. Тогда получается конфетка.



Мы в соцсетях
c
Delphi
Урок 54 - Потоки в Delphi, (часть 2/3)

  В этом уроке мы научимся правильно запускать наш поток.

//Запускать поток будем нажатием на кнопку:
TForm1.Button1Click(Sender: TObject);
begin
	//Вначале нужно создать экземпляр потока:
	MyThread:=TMyThread.Create(False);
	//Параметр False запускает поток сразу после создания, True - запуск впоследствии , методом Resume
	//Далее можно указать параметры потока, например приоритет:
	MyThread.Priority:=tpNormal;
	//Можно указать что после завершения кода поток завершится автоматически:
	MyThread.FreeOnTerminate:=true;
end;

end.
  Ну вот, даже этот минимальный код позволяет поэкспериментировать с потоками и посмотреть, что они создаются в системе, работают, уничтожаются. Например, измените условие завершения потока:
	MyThread.FreeOnTerminate:=false; //Поток не будет уничтожен после завершения работы
Теперь в Диспетчере Задач Windows можно наблюдать, что при каждом нажатии на кнопку Button1 в нашем приложении количество потоков в проекте Project1 увеличивается.

А теперь поместите в процедуру Execute такой оператор:
	MyThread.Terminate;
Метод Terminate уничтожает данный экземпляр потока. Теперь при нажатии кнопки в приложении количество потоков всё равно остаётся равным 1 (это главный поток приложения), так как сразу после создания новый поток уничтожается методом Terminate, и мы просто не успеваем заметить краткий миг его существования. Тем не менее, это означает, что код потока в процедуре Execute выполняется!

Ещё пример. Если в основной программе попробовать выполнить такой цикл:
	while True do;
то приложение зависнет. А теперь поместите его в процедуру Execute. При нажатии на кнопку наш бесконечный цикл будет непрерывно выполняться в потоке, однако и приложение как целое не зависнет.

  При работе с потоками необходимо учитывать приоритет создаваемых потоков. Так, если в предыдущем примере запустить не один поток, а два или больше, то компьютер станет очень заметно "тормозить". Это происходит потому что приоритет по умолчанию новых потоков - нормальный. Можно уменьшить его, задав
	MyThread.Priority:=tpLower;
Этого достаточно, чтобы компьютер чувствовал себя более свободно. Вот таблица приоритетов:

Приоритет Описание
tpIdle Низший приоритет. Поток получает время только тогда, когда операционная система находится в состоянии простоя.
tpLowest Приоритет на два пункта ниже нормального
tpLower Приоритет на один пункт ниже нормального
tpNormal Нормальный приоритет
tpHigher Приоритет на один пункт выше нормального
tpHighest Приоритет на два пункта выше нормального
tpTimeCritical Максимальный приоритет. Приоритет на уровне функций ядра операционной системы.


   В следующем уроке будет пример скачивания файла из интернета в потоке.

Удачи!
Встретимся в следующем уроке!


Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 23 Июня 2013
Просмотров: 7992

Урок 53 - Потоки в Delphi, (часть 1/3) Урок 55 - Потоки в Delphi, (часть 3/3)

Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.



аватар Добавил: sorokin [Новичок] Дата: 2013-07-17
Спасибо Александр за хороший сайт где все подробно объяснено и приведены примеры. У меня есть вопрос по текущему уроку. После того как я создал вручную поток MyThread и вбил код описанный выше, я запустил программу, но в диспетчере задач так ничего и не увидел, никаких изменений. В чем может быть проблема? Спасибо.




аватар Добавил(а): Joker1999obp [Новичок] Дата: 2013-10-25
наведи курсор на фразу в Диспетчере Задач Windows можно наблюдать




аватар Добавил(а): Joker1999obp [Новичок] Дата: 2013-10-25
а нет всёравно не работает