Нити (threads)
Шта су нити? и зашто их користимо?
Ранијих дана програмирања сви програми су били једноструки и једноструки задаци у којима ће се ваш програм изводити искључиво на машини или уопште неће радити. Са све софистициранијим апликацијама и све већим захтјевима за персоналним рачунарима, сада су доступни оперативни системи са више процеса и више нити. Multithreading на рачунарском програмирању је углавном био потребан за боље перформансе и употребљивост.
Дакле, прво да пређемо на процес. Процес је програм који ради на систему и користи системске ресурсе као што су CPU, меморија итд. И сваки процес има главну нит. У Процесу се многе радње могу изводити једна по једна у брзом редослиједу.
Thread се генерално користи за обављање неколико скупова радњи одједном у ситуацијама као што неке радње могу изазвати значајно кашњење, али током тог периода програм би требало да буде у стању да изврши и друге радње.
На примјер, у Windows Explorer-у копирамо велику количину података из једне фасцикле у другу фасциклу и открили смо да ће то потрајати, али током копирања можемо да радимо и друге послове. Дакле, у овом случају се процес копирања одвија у новој нити која не утиче на главну нит.
Нити се углавном користе у случају проблема везаних за перформансе. Ево неколико примjера гдjе бисмо могли да користимо нити.
– Дуготрајна обрада: Када Windows апликација израчунава, не може више да обрађује поруке. Као резултат тога, екран се не може ажурирати.
– Обрада у позадини: Неки задаци можда нису временски критични, али морају да се извршавају непрекидно.
– Обављање I/O посла: I/O на диск или у мрежу може имати непредвидива кашњења. Нити вам омогућавају да осигурате да I/O операција не одлаже неповезане делове ваше апликације.
Како ово функционише? Шта ради синхронизација?
Код који се позива када се позове синхронизација може да изврши било шта што би главна VCL нит могла да уради. Поред тога, он такође може да модификује податке повезане са сопственим објектом нити, безбедан у сазнању да је извршење сопствене нити у одређеној тачки (позив за синхронизацију). Оно што се заправо дешава је прилично елегантно и најбоље илуструје још један дијаграм паука.
Када се позове синхронизација, главна нит прорачуна је суспендована. У овом тренутку, главна VCL нит може бити суспендована у стању мировања, може бити привремено суспендована на I/O или другим операцијама, или може да се извршава. Ако није суспендован у потпуно неактивном стању (главна петља порука апликације), онда нит главног прорачуна чека. Када главна нит постане неактивна, функција без параметара прослеђена синхронизацији се извршава у контексту главне VCL нити. У нашем случају, функција без параметара се зове UpdateResults и игра се са белешком. Ово осигурава да неће доћи до сукоба са главном VCL нити, а у суштини, обрада овог кода је слична обради било ког Delphi кода који се јавља као одговор на слање поруке апликацији. Не долази до сукоба са нити која је позвала синхронизацију јер је суспендована на познатој безбједној тачки (негдје у коду за TThread.Sinchronise).
Једном када се ова „обрада путем проксија“ заврши, главна VCL нит је слободна да ради свој нормалан рад, а нит која је позвала синхронизацију се наставља и враћа се из позива функције.
Стога се чини да је позив за синхронизацију још једна порука главној VCL нити и позив функције главној нити прорачуна. Нити су на познатим локацијама и не извршавају се истовремено. Нема услова за трку. Проблем ријешен.