Урок 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 Максимальный приоритет. Приоритет на уровне функций ядра операционной системы.


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

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




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



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



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



Добавил(а): Theihpled Дата: 2017-11-07
Кстати да. С потоками тоже ничего не вышло.


    No results found.
Отменить.