Поиск простых чисел — вариант с несколькими нитями
function DoFactor (NotUsed: Pointer):integer;
var
Low, High, Count, Count2: integer;
begin
// очистим ListBox1
Form1.ListBox1.Items.Clear;
// зададим диапазон
Low := strtoint(Form1.edit1.Text);
High := strtoint(Form1.Edit2.Text);
// найдем простые числа
for Count := Low to High do
begin
Count2 := 2;
while (Count2 < Count) and not(Count mod Count2 = 0) do
inc(Count2);
// выведем в ListBox
if (Count=Count2) then
Form1.ListBox1.Items.Add(inttostr(Count));
end //for
end;
procedure TForm1.Button1Click(Sender: TObject);
var
THID : DWORD;
begin
CreateThread (nil, 0, @DoFactor, nil, 0, THID);
end; // procedure
При написании новой программы не надо пытаться установить все функции в отдельные потоки. Каждый поток накладывает на программу дополнительную сложность и неустойчивость, и отлаживать потоки намного сложнее.
Примеры ситуаций, когда код нужно или не нужно помещать в отдельный поток:
Если какие-то функции должны выполняться параллельно основному процессу, выделение потока обязательно.
Если какие-то расчеты идут достаточно долго, многие считают, что их тоже нужно помещать в поток. Во время расчетов, программа блокируется и невозможно нажать кнопку Отмена или произвести какие-либо действия. В данном случае можно обойтись и без потока. Достаточно внутри расчетов поставить ВЫЗОВ Application.ProcessMessages, И В ЭТОМ месте выполнение расчетов будет прерываться на некоторое время, а программа будет обслуживать другие сообщения, пришедшие от пользователя. Таким образом получится простой эффект многозадачности без использования потока.
Код критичен к времени выполнения. Допустим, что программа должна принимать какие-то данные по СОМ-порту. Как только в порт поступили данные, они должны быть моментально обработаны с минимальной задержкой. Обработку таких ситуаций желательно выносить в отдельный поток, потому что если в момент поступления данных программа занята большими расчетами, то данные могут оказаться, в лучшем случае, необработанными, в худшем — потерянными.
Истинную многозадачность можно получить только на многопроцессорных системах, где каждый процессор выполняет свою задачу. Чтобы создать многозадачность на одиночных процессорах, используют псевдомногозадачность. В этом виде один процессор выполняет сразу несколько задач благодаря быстрым переключениям между ними. Например, процессор может выполнять сразу десять задач, при этом каждой из них выделять по 10 миллисекунд своего рабочего времени. В этом случае процессор будет через определенные промежутки времени переключаться между задачами, и у пользователя будет создаваться иллюзия того, что они выполняются одновременно. Но это общий вид псевдомногозадачности, реально она реализована более сложным образом.
Начиная с 32-разрядных версий, в Windows используется вытесняющая многозадачность (до этого была согласованная). В такой среде ОС разделяет процессорное время между разными приложениями и потоками на основе вытеснения.
Разделение происходит в основном благодаря приоритету потока. У каждого потока есть приоритет, по которому определяется его важность. Чем выше приоритет, тем больше процессорного времени ему выделяется.
Потоки с одинаковым приоритетом будут получать одинаковое количество процессорного времени.
У дополнительных потоков приоритет выставляется такой же, как и у главного потока программы, но его можно увеличить, или уменьшить.
