Но сначала о том, что должно происходить в потоке. Выполнение текущего потока предполагает выполнение программного кода.
Откуда этот код? От функций, естественно. От статических и нестатических методов-членов класса. И запустить поток можно единственным способом – указав точку входа потока - метод, к выполнению операторов которого должен приступить запускаемый поток.
Точкой входа ПЕРВИЧНОГО потока являются СТАТИЧЕСКИЕ функции Main или WinMain. Точнее, первый оператор метода.
Точка входа ВТОРИЧНОГО потока назначается при создании потока.
А дальше – как получится. Поток выполняется оператор за оператором. Со всеми циклами, заходами в вызываемые функции, в блоки свойств, в операторы конструкторов… И так продолжается до тех пор, пока не возникнет:
§ неперехваченное исключение,
§ не будет достигнут конец цепочки операторов (последний оператор в функциях Main или WinMain),
§ не будет отработан вызов функции, обеспечивающей прекращение выполнения потока.
В силу того, что первичный поток создаётся и запускается автоматически (без какого-либо особого участия со стороны программиста), то и заботиться в случае простого однопоточного приложения не о чем.
При создании многопоточного приложения забота о создании дополнительных потоков – забота программиста. Здесь всё надо делать своими руками.
Деятельность по созданию потока предполагает три этапа:
§ определение метода, который будет играть роль точки входа в поток,
§ создание объекта-представителя специального класса-делегата (ThreadStart class), который настраивается на точку входа в поток,
§ создание объекта-представителя класса потока. При создании объекта потока конструктору потока передаётся в качестве параметра ссылка на делегата, настроенного на точку входа.
Замечание. Точкой входа в поток не может быть конструктор, поскольку не существует делегатов, которые могли бы настраиваться на конструкторы.