48837 (666099), страница 4
Текст из файла (страница 4)
Приклад такого ресурсу – загальний блок у файлі, що відображається в пам'ять. Оскільки цей ресурс має ім'я, можна зробити його унікальним саме для вашого додатку:
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.
-
Не «пересинхронізіруйте» ваш додаток, а не те воно працюватиме як один єдиний потік. Надмірно синхронізований додаток втрачає всі переваги від наявності декількох потоків, оскільки вони постійно зупинятимуться і чекатимуть синхронізації. Потоки надають витончене рішення деяких сьогоднішніх проблем програмування; але вони також ускладнюють і без того непростий процес відладки. Та все ж переваги потоків однозначно переважують їх недоліки.