Потоци в Делфи

В този урок ще разгледаме възможността за разработване на многонишковите приложения в Делфи. За да започнете, нека да видим какво имаме нужда от същите тези потоци, които представляват.

С оглед изпълнението на многозадачност, операционната система разпределя всяко приложение определено количество процесорно време, че тя се опитва да се разпространява на поставените приоритети. По този начин изпълнението на всяка задача / нишка е ограничен от операционната система, като част от своята процесорно време. С цел да се извършват никакви действия в паралел (псевдо), можем да създадем допълнителни теми, и те изпълняват същите тези действия. Ако правилно разпределят някакви сложни операции в нашата молба, то значително ще увеличи ефективността на софтуер.

Реализация. клас TThread

Класове в модула в Делфи има специален клас TThread, предназначен за създаване на поток. Не забравяйте да се свържете класове уреда. Помислете за създаването на един прост поток. За това ние трябва да пиша този клас, който ще бъде наследена от TThread клас. За да направите това ще видим нашия тип модул.
[Cc Lang = »Delphi»] вид
TMyThread = клас (TThread) // описва клас на новия поток
частен

защитени
Изпълнение процедура; отменят; // Изпълнение метода ще бъде директно тялото на потока -
// код, за да бъдат обработени в него.
край [/ см]
Сега поставете курсора върху нашето описание на метода стартирате, натиснете Ctrl + Shift + C, за да се премине към изпълнението на този метод. Ще видим следния код:
[Cc Lang = »Delphi»] процедура TMyThread.Execute;
започвам

край [/ см]
В организма на тази процедура, ние ще трябва да се напише код, който ще бъде обработено в нашия поток.
Това е най-простият начин да реализираме нашия поток. Остава само да се справи с факта, че това може да се използва. Създаване на копие на нашия TMyThread поток:
[Cc Lang = »Delphi»] Var MyFirstThread: TMyThread;
започвам
MyFirstThread: = TMyThread.Create (невярно);
край [/ см]
В нашия случай, минахме на строителя Създаване на нашия параметър поток неверни. Това означава, че нашата поток ще се стартира веднага след създаването му. Ако преминете Вярно е, че потокът ще се стартира, когато ние го наричаме Възобновяване метод. Веднага след стартиране, потокът ще започне да се изпълнява кода на метода Execute.
Потоци могат да бъдат настроени техния приоритет, от които размерът на процесорно време ще зависи от това, което освободи активното OS нишка. С други думи, ние можем да настроим изпълнението на роднина на потока към другия. Това се прави с помощта на свойствата на нашия Приоритет поток:
[Cc Lang = »Delphi»] MyFirstThread.Priority: = tpNormal [/ см]
Има седем нива на приоритет за потоците:

  • tpIdle - Най-ниското ниво на потока се извършва по време на "празен ход" система.
  • tpLowest
  • tpLower
  • tpNormal
  • tpHigher
  • tpHighest
  • tpTimeCritical - Най-високо ниво. приоритет изпълним нишка, еквивалентен на приоритета на ядрото на операционната система.

Не прекалявайте с приоритетите 🙂 Използването tpTimeCritical или tpHighest са множество нишки може да направи компютъра ви "мисля". Опитайте се да използвате tpLower или tpNormal.
Налице е също така полезен FreeOnTerminate собственост, ако го настроите да Вярно е, че потокът е унищожена автоматично, веднага след като кода Execute метод е завършен.
За извършване на операции по цикличен поток, който е подобен на следното:
[Cc Lang = »Delphi»] процедура TMyThread.Execute;
започвам
докато истинската задачи
започвам

приключи;
край [/ см]
Докато цикъл съдържание поток ще бъде обработена, докато във вътрешността на веригата няма да бъде причинено почивка или докато потокът е завършена ръчно.
Е, най-накрая, можете да унищожи потока Прекратяване метод:
[Cc Lang = »Delphi»] MyFirstThread.Terminate [/ см]
Следователно, налице е прекратен метод, който връща истина, ако потокът е завършена / унищожен.
Полезно е да използвате метода спре да спре конец, а след това се възобнови работата поток ще се използва методът на автобиография. За да се определи дали потока може да се използва спряно Suspended метод, който връща истина, ако конецът е спряно.

Един от основните проблеми с конци е невъзможността за достъп до всички данни от два потока едновременно.
[Внимание] вероятно едновременното лечение ще доведе до достъп нарушение грешка. [/ Внимание]
Най-типичен пример на грешката е позоваване на GUI (за образуване визуални компоненти) от новия поток. Въпросът е, че графичния потребителски интерфейс се изобразява и обработват непрекъснато в основната нишка на вашата кандидатура, която също се обработват, а другата е вашата основна код. Така че ако отидем в графичния потребителски интерфейс все още е извън поток, тогава има, защото за грешка GUI вече се използва от друга нишка. Един от най-често срещаните Решението на този проблем е да се синхронизира, което ние сега обсъдим.
Синхронизацията ви позволява да изпълнява метод в основната нишка приложение, то причинява на това в друга тема.
[Внимание] Не забравяйте! Всички техники, които ще бъдат поискани от потока на тялото, ще се наричат ​​и обработват в този поток. И само за метод повикването в главния поток, се използва синхронизация. [/ Внимание]
Например, прилагането на синхронизация ChangeGUI създаде метод, по който ние ще се обърнете към нашия графичния потребителски интерфейс, и съответно, да бъде изпълнено в основната нишка, и призова от новата ни. Също така в нашата колекция от текущото поле на име бр, където ще се съхранява броя и постоянно увеличаване на потока й вътре в тялото (например).
[Cc Lang = »Delphi»] вид
TMyThread = клас (TThread) // описва клас на новия поток
частен

бр: цяло число;
защитени
процедура ChangeGUI; // метод, в който ще се прилага на GUI, и които ще бъдат обработени на основната нишка.
Изпълнение процедура; отменят; // Изпълнение метода ще бъде директно тялото на потока -
// код, за да бъдат обработени в него.
приключи;

процедура TMyThread.ChangeGUI;
започвам
Form2.Label1.Caption: = IntToStr (бр); // Показване на новата стойност на бр
приключи;

процедура TMyThread.Execute;
започвам
докато Вярно задачи
започвам
ако бр = 1000000 тогава
бр: = 0;

Inc (бр); // Увеличение бр единица

Синхронизиране (ChangeGUI); // Същият синхронизацията! Променете етикет Label1 в основния поток
приключи;
приключи;

процедура TForm2.FormCreate (Sender: TObject);
Var
MyFirstThread: TMyThread;
започвам
MyFirstThread: = TMyThread.Create (невярно); // Създаване на нашия Feed
MyFirstThread.Priority: = tpLower; // Комплект приоритет
приключи;
[/ Cc]
Както можете да видите от списъка по-горе, за да се предизвика поток в основен метод на поток, трябва да мине този метод като параметър за метода на Синхронизиране. Ако се обадите метод не чрез синхронизиране и аз съм сигурен, че вашата програма няма да живее дълго 🙂 вероятно да възникне някакъв конфликт или в основния поток, или в новия ни, в резултат на което програмата свърши изпълнението му с грешка.
Като цяло, изучава потоци, експериментирайте с тях, а аз винаги както се прикачва източник, който можете да изтеглите от този линк.