Значить, ми навчилися створювати потоки. Але отут спливає цікава річ: що буде, якщо два потоки звертаються до одних і тих же даних по запису? Наприклад, два потоки намагаються змінити заголовок головної форми.Спеціально для цього в ОС реалізовані механізми синхронізацій. Зокрема, у класі tthread є метод дозволяє уникнути паралельного доступу до vcl-компонентів: procedure synchronize (method: tthreadmethod); Він то і дозволяє уникнути конфлікту при зверненні до одних vcl-компонентів різними потоками. Як параметр йому передається адреса процедури без параметрів. А як викликати з параметрами? Для цього можна використовувати внутріклассовие змінні. tnew = class (tthread) private {Private declarations} st: string; procedure update; protected procedure execute; override; end; var new: tnew; ... procedure update; begin form1.caption: = s; end; ... begin s: = 'yes'; synchronize (update); end; Ось повний приклад, в якому метод addstr додає в memo кілька рядків. Якщо ми просто викличемо метод, то рядки від потоків будуть додадуться в довільному порядку. Якщо addstr викличемо методом synchronize, то рядки додадуться спочатку від одного потоку, а потім від другого. Виходить, що потік монопольно захоплює ресурс memo і додає в нього необхідну інформацію, після додавання потік звільняє memo і ось тепер вже інший потік може додавати в memo свої дані. Поменше слів - побільше ресурсів: unit unit1; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls; type tform1 = class (tform) memo1: tmemo; button1: tbutton; procedure button1click (sender: tobject); private {Private declarations} public {Public declarations} end; tnew = class (tthread) private s: string; procedure addstr; protected procedure execute; override; end; var form1: tform1; new1, new2: tnew; implementation {$ R *. dfm} procedure tform1.button1click (sender: tobject); begin new1: = tnew.create (true); new1.freeonterminate: = true; new1.s: = '1 thread '; new1.priority: = tplowest; new2: = tnew.create (true); new2.freeonterminate: = true; new2.s: = '2 thread '; new2.priority: = tptimecritical; new1.resume;
new2.resume; end; {Tnew} procedure tnew.addstr; begin form1.memo1.lines.add (s); sleep (2); form1.memo1.lines.add (s); sleep (2); form1.memo1.lines.add (s); sleep (2); form1.memo1.lines.add (s);sleep (2); form1.memo1.lines.add (s);end; procedure tnew.execute; begin synchronize (addstr); Addstr; / / Виклик методу без синхронізації end; end.