_______Определение_________
Многопоточность - это свойство платформы (Windows, Linux и т.д.), заключающееся в том, что процесс, запущенный в операционной системе может состоять из потоков (под-процессов, если очень грубо).
Подробнее. Один процесс (в данном случае наша программа) может содержать внутри себя несколько потоков, которые будут использовать ресурсы PC, например память. Очень хорошая аналогия показана на Wikipedi'и - "В качестве аналогии потоки выполнения процесса можно уподобить нескольким вместе работающим поварам. Все они готовят одно блюдо, читают одну и ту же кулинарную книгу с одним и тем же рецептом и следуют его указаниям, причём не обязательно все они читают на одной и той же странице."
К примеру Microsoft Office Word: печатая текст, у нас мгновенно появляется проверка на орфографию - неверные слова подчёркиваются курсивом. Орфография выполняется как раз во втором потоке, а процесс считывания данных с клавиатуры (набор текста нами) в первом. Это позволяет оптимизировать скорость программы, разграничить и оптимально использовать ресурсы PC.
Важно понимать, что каждый новый поток в программе - наследник класса TThread, и представляет собой отдельный блок, в котором помимо стандартных процедур мы задаём свой код выполнения. Соответственно каждый новый поток - это определённый вес программе, как в плане физическом, так и для оперативной памяти (если поток несёт в себе какую-либо функцию). Так что создавая поток, важно подумать, нужен ли он программе и будет ли он ей полезен.
Проверить работу без многопоточности достаточно просто, например задать программе выполнение цикла и одновременно форматирование текста. А после передвинуть форму. Наверняка программа зависнет, так как в один поток (основной) было заложено слишком много действий, а выполнение команд в одном потоке задано последовательно.
_______Задание потоков_________
Потоки в Delphi возможно задавать двумя способами - через мастер и вручную. Рассмотрим задание потока через мастер:
1) Files -> New -> Other...:
2) В открывшемся диалоге "New Items" выбираем Delphi Files -> Thread Object -> Ok:
3) Вводим имя потока - > Ok:
4) Появляется модуль-заготовка потока:
5) Profit!
Таким образом. Теперь рассмотрим задание потока вручную:
В Основном блоке (unit) прописываем новую секцию Type:
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
Далее ставим курсор на описание процедуры Execute, нажимаем Ctrl+Shift+C и процедура создаётся:
+
CTRL+SHIFT+C
=
Profit.
Таким образом научились задавать потоки двумя способами. Я рекомендую делать это вручную, дабы не плодить лишние визуальные блоки.
В процедуре Execute прописываем код выполнения для потока. Основные методы:
Create (false/true) //Создание потока. При параметре false поток начнёт свою работу сразу же после его создания. При true - после вызова метода Resume;
Priority //Уровень приоритета потока;
Уровни приоритета:
tpIdle
tpLowest
tpLower
tpNormal
tpHigher
tpHighest
tpTimeCritical
tpIdle - является самым низким уровнем приоритета, а tpTimeCritical является самым высоким уровнем приоритета.
Для уничтожения потока из памяти существует метод
Terminate;
Для приостановления потока на некоторое время -
Suspend;
Для возобновления работы -
Resume;
На этом знакомство с потоками завершаем.