Урок 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.