Разработка многопоточных приложений. Рудалев В.Г - 6 стр.

UptoLike

6
// используя функцию API
textout(dc,10,10,pchar(s), length(s));
end;
ReleaseDC(Form1.handle,dc); //Освобождаем контекст
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Вызываем функцию Func в составе потока. Для этого
// создаем поток и передаем в него адрес функции
hThread := CreateThread(Nil,0,@Func,Nil,0,THreadID);
if hThread=0 then ShowMessage('No THread');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SuspendThread(hThread); // Приостанавливаем поток
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ResumeThread(hThread); // Продолжаем поток
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Func(nil); // Вызываем функцию обычным способом
end;
end.
В результате выполнения окно программы примет вид:
Комментарии
1. При нажатии кнопки «Создать поток» будут выполняться не один , а два
потока: основной поток приложения обрабатывает сообщения , адресованные
главной форме, дополнительный выводит числа. Если вызвать функцию
Func(nil) напрямую (при нажатии кнопки «Без потока» ), то все операции будет
выполнять основной поток, поэтому программа «зависнет» , пока не закончится
цикл. В это время окно не реагирует на события , не позволяя себя ни переместить ,
                              // используя функцию API
            textout(dc,10,10,pchar(s), length(s));
         end;
         ReleaseDC(Form1.handle,dc); //Освобождаем контекст
       end;

       procedure TForm1.Button1Click(Sender: TObject);
       begin
         // Вызываем функцию Func в составе потока. Для этого
         // создаем поток и передаем в него адрес функции
         hThread := CreateThread(Nil,0,@Func,Nil,0,THreadID);
         if hThread=0 then ShowMessage('No THread');
       end;

       procedure TForm1.Button2Click(Sender: TObject);
       begin
         SuspendThread(hThread); // Приостанавливаем поток
       end;

       procedure TForm1.Button3Click(Sender: TObject);
       begin
          ResumeThread(hThread); // Продолжаем поток
       end;

       procedure TForm1.Button4Click(Sender: TObject);
       begin
         Func(nil); // Вызываем функцию обычным способом
       end;
       end.
       В результатевы п олнения окно п рог раммы п риметвид:




       К ом м е
              н тар и и

        1. П ринаж атиикноп ки« Создать п оток» б удутвы п олняться неодин, адва
п отока: основной п оток п рилож ения об раб аты вает сооб щ ения, адресованны е
г лавной ф орме, доп олнительны й – вы водит числа. Е с      ли вы звать ф ункцию
Func(nil) нап рямую (п ри наж атии кноп ки « Без п отока»), то все оп ерации б удет
вы п олнять основной п оток, п оэтому п рог рамма« зависнет», п окане закончится
цикл. В это время окно нереагируетнасоб ы тия, неп озволяя себ я нип ереместить,

6