Робота з потоками в формі CBuilder

Щоб працювати з потоком, треба його створити Це доручається формі, що містить потік, і здійснюється простим викликом оператора new для створення нового обєкта «потік» У нашому прикладі ми створимо потік при створенні форми Створіть обробник події форми OnCreate і помістіть в метод FormCreate наступний код:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

pThread = new TCheckThread(FALSE) pThread-&gtAssignLabel( Label1 )

}

Коли ви створюєте потік, то у вас є можливість створити його або призупиненим (suspended), або ні Параметр конструктора потоку являє собою булевское (логічне) значення, яке вказує, в якому режимі створювати потік Призупинений режим – це як ніби ви «усипляєте» потік, поки вам не знадобиться його «розбудити» зі свого додатку Якщо ви запустите потік в загальмованому режимі, то на вас лягає відповідальність за виклик потоку до життя, виконуючи метод Resume (Продовжити) потоку

Навіщо вам створювати потік в загальмованому режимі Для цього можуть бути дві причини Перша полягає в тому, що через деякі проблем у розподіліть ля часу Windows існує ймовірність, що потік запуститься до того, як закінчиться виконання конструктора класу потоку Якщо це є проблемою для вас, то створюйте потік в загальмованому режимі, потім викликайте методResume останньою операцією в конструкторі Простий приклад

такого коду виглядає так:

TMyThread::TMyThread( bool bSuspend )

: TThread (true) / / призупинений режим

{

/ / Що-небудь ініціалізувати

/ / Запустити потік, якщо потрібно if (bSuspend == false) Resume ()

}

Вам потрібно вирішити, чи потрібно писати це у вашому коді Це дуже простий код, нічому не заважає, так що, ймовірно, ви захочете завжди створювати потоки саме таким чином

У нашому прикладі ми створюємо потік в звичайному (Не припиненому) режимі, тобто потік запуститься відразу, як тільки все буде для цього зроблено Ми можемо так вчинити, бо нам не потрібні ніякі особливі умови для запуску потоку

Коли потік запустився, у користувача є кілька варіантів, як його можна зупинити По-перше, можна зупинити потік, натиснувши на кнопку Зупинка Щоб зупинити потік, потрібно передати методом потоку Execute, Що він

повинен зупинитися Поглянувши на метод Execute, ми бачимо, що він завершується, коли прапор Terminated дорівнює true (істина) Для того щоб звернути це значення (Terminated) В істинне, вам потрібно викликати метод класу потоку Terminate (Зупинити) Додайте наступний обробник натискання на кнопку Зупинка в класі форми:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

pThread-&gtTerminate()

}

Ще один спосіб, яким можна (при) зупинити і продовжити виконання потоку, – побачити в дії, додавши у класі форми обробник для кнопки Пауза:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

pThread-&gtSuspend()

}

Як бачите, використовується метод потоку Suspend Це тимчасово зупинить потік, але не вбє його Метод Execute не викликається, коли потік призупинено Є одна дивна деталь відносно зупинки потоку методом Suspend Виклик цього методу не є перемикачем

«Вимкнути / включити» потік Якщо викликати Suspend кілька разів, то при кожному виклику буде

наростати лічильник Щоб за новою запустити потік, який зупиняли кілька разів методом Suspend, Вам доведеться викликати методResume  таке ж число раз Процес виглядає

приблизно так:

Suspend: Лічильник = 1 Suspend: Лічильник = 2 Suspend: Лічильник = 3

Resume: Лічильник = 2 Потік не запускається Resume: Лічильник = 1 Потік не запускається Resume: Лічильник = 0 Потік нарешті запускається

Навіщо вам може знадобитися кілька разів зупиняти потік викликами Suspend Існує велика кількість причин для цього, але основна полягає в тому, що ви викликаєте клас, успадкований від класу потоку, з класу, успадкованого від класу форми Якщо у вас є різні умови на різних рівнях спадкування, при яких ви не хочете запускати потік, то ви будете викликати метод Suspend на всіх цих рівнях Щоб за новою запустити потік, потрібно щоб всі ці рівні погодилися з тим, що умови їх влаштовують

Остання дія – кнопка Продовження Натискання на цю кнопку приведе до зменшення лічильника зупинок потоку Якщо натиснути спочатку на кнопку Пауза, а потім на кнопку Продовження

, То ви побачите, що потік спочатку перестав виводити числа на екран, а потім продовжив своє заняття Створіть обробник натискання на кнопку Продовження і додайте в нього наступний код:

void __fastcall TForm1::Button3Click(TObject *Sender)

{

pThread-&gtResume()

}

Ось, загалом-то, і все, що вам потрібно знати про роботу з потоками в формі CBuilder робить спілкування з потоками надзвичайно простим, так що вам майже нічого не потрібно знати про те, що відбувається за лаштунками роботи з потоками Важливими моментами в даному прикладі є наступні: потік повинен бути створений, для потоку має бути задане умова виходу, і потік повинен бути зупинений Крім того, якщо ви памятаєте про те, що треба використовувати метод Synchronize для спілкування потоку з обєктами VCL у формі, то ви знаєте все, що потрібно для програмування потоків

Просто щоб показати вам, що нічого складного тут немає, ми розберемо набагато більш суворий приклад роботи з потоками

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*