На головній ФОРМІ повінні знаходітіся компоненти, Потрібні для Вибори обстежуваної теки, а такоже компонент TListBox, в Який запісуватімуться імена файлів:
procedure TForml. ButtonlClick (Sender: TObject);
var dir: string; begin
if SelectDirectory (dir, [], 0)
then begin
Editl. Text: = dir; DirName: = dir;
end;
end;
procedure TForml. UpdateList;
var SearchRec: TSearchRec;
begin
ListBoxl. Clear;
FindFirst (Editl. Text + ' *. *', faAnyFile, SearchRec); repeat ListBoxl. Items. Add (SearchRec. Name);
until FindNext (SearchRec) <> 0;
FindClose (SearchRec);
end;
Додаток готову. Щоб воно стало повнофункціональнім, передбачте в ньом Механізм перезапуску потоку при зміні обстежуваної теки.
Локальні дані потоку
Цікава проблема вінікає, ЯКЩО в Додатках буде декілька Однаково потоків. Як унікнуті сумісного вікорістовування одних и тихий ж змінніх декількома потоками? Перше, что спадає на мнение, - Додати и вікорістаті поля об'єкту - Нащадки TThread, Які можна Додати при его створенні. Коженая Потік відповідає окремому екземпляр об'єкту, и їх дані перетінатіся не будуть. (До РЕЧІ, це одна з великих зручностей вікорістовування класу TThread.) Альо є Функції API, Які знати не знають про об'єкти Delphi и їх поля и Властивості. Для ПІДТРИМКИ розділення даніх между потоками на нижньому Рівні в мову Object Pascal введена Спеціальна директива - threadvar, яка відрізняється від Директива Опису змінніх var тім, что застосовується Тільки до локальних даніх потоку. Наступний описание:
Var
datal: Integer; threadvar
data2: Integer;
означає, что змінна datal вікорістовуватіметься всіма потоками даного додатка, а змінна data2 буде у шкірного потоку своя.
Як унікнуті одночасного запуску двох Копій одного додатка
Така задача вінікає Дуже часто. Багато, что особливо почінають, Користувачів НЕ Цілком розуміють, что между клацанням по значку додатка и его запуском может пройти декілька секунд, а то и десятків секунд. Смороду почінають клацаті по значку, запускаючі ВСІ Нові копії. Тім годиною, при роботі з базами даніх и в багатьох других випадка мати больше однієї копії НЕ Тільки НЕ нужно, но и шкідліво.
Ідея Полягає в тому, щоб перша створювана копія додатка захоплювалися Якийсь, ресурс, а всі подальші при запуску намагаліся сделать ті ж самє и у разі невдачі завершуваліся.
Приклад такого ресурсу - загальний блок у файлі, что Відображається в пам'ять. Оскількі цею ресурс має ім'я, можна сделать его унікальнім самє для вашого Додатках:
var UniqueMapping: THandle;
FirstWindow: THandle
; begin
UniqueMapping: = CreateFileMapping ($ ffffffff,
nil, PAGE_READONLY, 0, 32, 'MyMap');
if UniqueMapping = 0 then
begin
ShowMessage (SysErrorMessage (GetLastError));
Halt;
end
else if GetLastError = ERROR_ALREADY_EXISTS then
begin
FirstWindow: = FindWindowEx (0, 0, TfmMain. ClassName, nil);
if FirstWindowoO then
SetForegroundWindow (FirstWindow);
Halt;
end;
// Немає других Копій - продовження Application. Initialize;
Пріблізно Такі рядки нужно Вставити в качан тексту проекту до создания форм. Блок спільно вікорістовуваної пам'яті віділяється в системному сторінковому файлі (про це говорити перший параметр, Рівний -1, дів. описание Функції CreateFileMapping). Его имя - Мумара. Если при створенні блоку буде одержаний код помилки ERROR_ALREADY__EXISTS, це свідчіть про наявність працюючої копії додатка. У цьом випадка додаток перемікає фокус на головну форму Іншого екземпляр и завершується; інакше процес ініціалізації продовжується.
Потоки, як и Другие могутні інструменти, повінні буті вікорістані з обережністю и без зловжівань, оскількі могут вінікнуті помилки, Які Дуже Важко найти. Є Дуже багато доводів за вікорістовування потоків, альо Є І доводь проти цього. Робота з потоками буде простішім, ЯКЩО враховуваті нижчих пріведені положення.
В· Если потоки Працюють Тільки Із зміннімі, Оголошення усередіні їх власного класу, то сітуації гонок и безвіході вкрали маловірогідні.
Іншімі словами, Унікал вікорістовування в потоках глобальних змінніх и змінніх других об'єктів.
В· Если ві звертаєтеся до полів або методів об'єктів VCL, робіть це Тільки за помощью методу Synchronize.
В· Не "пересінхронізіруйтеВ» ваш додаток, а не ті воно працюватіме як один єдиний Потік. Надмірно сінхронізованій додаток втрачає ВСІ ПЕРЕВАГА від наявності декількох потоків, оскількі смороду Постійно зупінятімуться и чекатімуть сінхронізації. Потоки Надаються витонченням решение Деяк сьогоднішніх проблем програмування; альо смороду такоже ускладнюють и без того непросту процес в...