нишки
При стартиране на ново приложение за него автоматично се създава основна нишка, в която ще се изпълнява програмният код. По всяко време можете да създадете допълнителни нишки, които ще работят успоредно на основната. Следователно всяка програма винаги е една основна нишка и нула или повече спомагателни (не се препоръчва да се създават повече от 16 процеса на еднопроцесорен компютър).
Потоците са полезни за различни цели. Те ви позволяват да изпълнявате задачи във фонов режим и позволяват на потребителя да се съсредоточи върху основната работа.
За визуално представяне, нека създадем приложение, което демонстрира работата на нишката.
Програмата стартира нишката с натискане на бутона Старт и броячът ще работи в компонента TLabel. В същото време можете лесно да въвеждате текст в RichEdit
1. Създайте нов проект. Инсталирайте компонентаTRichEdit от раздела Win32 и един компонентTLabel във формуляра. Ще ви трябват и няколко бутона - един за стартиране на нишката, а другият за спиране.
2. Сега създаваме модул за нишката. За да направите това, изберете елемент от менютоФайл Нов Друг, за да отворите прозореца за създаване на нов модул.ИзберетеОбект на нишка и натиснете бутонаОК. В резултат на това ще се появи прозорец:
3. В този прозорец трябва да посочите името на създадения поток -TCountobj. Натиснете бутонаOK и Delphi ще създаде модул за бъдеща нишка. Запазете целия проект - основната форма катоMain, нишката катоMyThread.
Обектът на нишката има само една процедураExecute (подготовка за кода на нишката), когато се създава, той се декларира като абстрактен - празен. Това означава, че на процедурата е дадено име, разпределено място в паметта, но нейният кодтрябва да се отмени във всички нишки, т.е. трябва да бъде написан собствен код, който ще се изпълнява паралелно с основната задача.
Променливатаindex е декларирана катоinteger в секциятаprivate на обекта поток. ПроцедуратаUpdateLabel също е декларирана там. Тази процедура изглежда така:
4. След това в модула на потока свързваме основния формуляр със секциятаuses, тъй като тя е достъпна в кода по-горе (Form1.Label1.Caption), за да актуализира текста на компонентаLabel1. МетодътExecute стартира цикъл while, който ще работи, докато индексната променлива е по-голяма от нула. Вътре в цикъла се извиква методът synchronize() и индексната променлива се увеличава. Ако тази променлива стане по-голяма от 100 000, тогава 0 се присвоява на индекс и изчислението спира. Така цикълът безкрайно ще увеличава променливатаindex от 0 до 100 000. Последната проверка е следната, ако прекратеното свойство е вярно, тогава излезте от процедурата и нишката ще приключи. Свойствотоterminated ще станеtrue, когато се извика методътTerminate на нишката.
5. За функциятасинхронизирай. Процедурата updateLabel му се предава като параметър, който произвежда изход към главния формуляр. Каква е целта на вмъкването на рутина за извеждане на екрана в синхронизиране? VCL библиотеката има един недостатък - не е безопасна за нишки. Всички потребителски компоненти са проектирани така, че само една нишка да има достъп до тях. Ако основната форма и нишката се опитат да покажат нещо в една и съща екранна област или компонент едновременно, програмата ще се срине. Следователно целият изход към формуляра трябва да бъде отделен в отделна процедура и тази процедура трябва да се извика с помощта на Synchronize.
Ако процедурата е извикана в методСинхронизирайте, тогава само обектът, който е извикал метода за синхронизиране, има достъп до компонентите на прозореца. Този процес е невидим за потребителя.
По този начин, ако трябва да покажете някои данни от потока на екрана на главния прозорец, направете го в отделна процедура и я извикайте с помощта на метода за синхронизиране. Потокът е готов.
Ето защо трябва да добавите модулаMyThread към първия разделuses.
В секциятаprivate декларирайте променлива от тип TCountobj (поточен обект).
При натискане на бутонаИзпълни напишете кода:
Първият ред от код създава нишка с. Параметърът може да бъде true или false. Ако е невярно, тогава нишката започва да се изпълнява незабавно, в противен случай нишката се създава, но не се стартира. Ако нишката е създадена без натискане, тогава трябва да се използва методът Resume, за да се стартира, което се случва във втория ред. Третият ред задава приоритета на по-малка нишка, така че да не пречи на работата на основната нишка и да работи във фонов режим. Ако зададете по-висок приоритет, тогава основната нишка ще започне да се забавя, защото те ще имат еднакви приоритети.
За събитиетоonclick на бутонаСтоп напишете следния код:
Тук изпълнението на нишката се спира чрез извикване на методаTerminate на обекта на нишката. След извикване на този метод прекратеното свойство ще стане истина и процедуратаExecute приключва.
Доста често възниква ситуация, когато искате да готвите беляши, но няма достатъчно време за караница с тесто с мая. В този случай тестото без мая на kz.all.biz ще бъде много полезно. |
7. Стартирайте програмата, стартирайте потока (чрез натискане на бутона Run) и въведете текст вRichEdit. Текстът ще бъде въведен безпроблеми и в този момент броячът ще работи в компонентаTLabel. Ако стартирате брояча без отделна нишка, няма да можете да въвеждате текст вRichEdit, тъй като всички ресурси на програмата (главната нишка) ще отидат за работата на брояча.