Обикновено унищожаване поток, програмиране в Делфи - уеб, MySQL

пълен проблем, стоп и унищожаване на нишки.

В глава 2, то се споменава няколко проблема с приключването на потока, основните от тях са:

  • Съществуващи ресурси освобождаване поток заети.
  • Първи резултати от потока при нейното приключване.

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

Ако потокът да обменят информация с VCL след завършване, е необходимо да се осигури механизъм за синхронизация с основния поток VCL нишката работник и основната нишка ще трябва да бъдат почистени VCL (трябва да напишете съобщение на код поток). Две механизми за това са описани по-долу.

Трябва да се помни още нещо:

  • спиране на потока на природното завършване.

Това се случва доста често. Някои потоци, особено тези, които се занимават с вход-изход, съдържат изпълнението на един безкраен цикъл: програмата винаги могат да получат нови данни, а дебитът трябва да бъде готов за тяхното получаване и обработка, докато програмата се изпълнява.
Така че, помислете за тези въпроси в обратен ред ...

Преждевременно спиране на потока.

В някои ситуации, една нишка може да се изисква да уведоми другата нишка за неговото завършване. Това обикновено се случва, когато нишката се изпълнява дълга операция, и потребителят реши да се откажат от прилагането или операция трябва да се прекъсва. TThread осигурява прост механизъм за подпомагане на такова действие, а именно метод и прекратен имота прекрати. Когато се създава нишка, прекратения Имотът е ЛЪЖА В, и всеки път, когато се нарича Прекратяване метод Прекратен имота за този поток е настроен на True. По този начин, всички потоци са отговорни за периодично проверява дали те не са спрели, а ако това се случи, за правилното приключване на работата. Имайте предвид, че не съществува мащабна синхронизация по този начин не се случва, когато един комплекти нишки Прекратени собственост на друг, не можем да се предполага, че друга нишка след прочита на стойността на неговите свойства Прекратени и да започнат процес на завършване. Прекратен имот се намира само на знаме, казва "Моля да се заключи, възможно най-скоро."

При проектиране на обекти текат необходими, за да се обърне внимание, за да проверите характеристиките на прекратени, ако това може да се изисква. Ако вашата нишка е блокиран, в резултат на който и да е от механизмите за синхронизация, обсъдени по-долу, можете да замените Прекратяване метод, за да го отключите. Не забравяйте, че трябва да се обадите на наследен метод прекрати и преди да го отключвате нишка, ако искате да се провери следното прекратен върна True. Ето един пример - лека модификация:

тече изчисление прости числа от предишния раздел с добавянето на проверка имоти прекратява. Аз вярвам, че това е приемливо, ако потокът ще се върне неправилен резултат, когато установи Прекратен имота.

OnTerminate събитие се случва, когато потокът на практика приключи. Това не се случва, когато се обадите Прекратяване метод поток. Това събитие може да бъде много полезно, тъй като той работи в контекста на основната VCL на потока, подобни методи, използващи нарича синхронизиране. Така че, ако искате да се извърши някакво действие с резба VCL, който се освобождава автоматично в края водачът на това събитие - идеалното място за такова действие. За повечето програмисти, начинаещи за работа с потоци, това е най-удобният начин за извличане на данни от не-VCL тече без усилие, без да са необходими ясни разговори за синхронизация.

OnTerminate работи в общи линии по същия начин като Синхронизиране и семантично почти идентични Синхронизиране поканата в края на потока. Основната полза от такава ситуация е, че чрез използване на знаме, например, «AppCanQuit» работа или обратно потоци в основната VCL на потока може да осигури прости механизми за проверка, че VCL главния поток се попълва само когато всички други теми са спрени. Има някои тънкости на синхрон, особено ако програмистът трябва да се обадите до събитие Application.Terminate OnTerminate поток, но тези проблеми ще бъдат обсъдени по-късно.

Контролирано спиране на потока - подход 1.

В този пример, ние използваме кода за простите числа в глави 3 и го променят, така че потребителят не може неволно затваряне на приложението, когато нишка работник. Това е доста проста. В действителност, ние не трябва да се промени на код поток. Ние трябва само да добавите поле позоваване брой на основната форма, тя се увеличава, когато създавате потоци, създайте OnTerminate събитие, което ще намали референтния брой, и когато потребителят се опита да затвори програмата, ще покажем, ако е необходимо, се диалогов предупреждение кутия.

Това показва колко е лесно да се постигне това: всички код, свързани с проследяване на броя на нишките се извършва в основната нишка VCL, и този код реагира на събития, както обикновено се прави в Делфи-приложения. В следващия раздел разглеждаме по-сложен подход, който има някои предимства от използването усъвършенствани механизми за синхронизиране.

Вижте също: