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

datai: Integer;
threadvar data2: Integer;

означает, что переменная datai будет использоваться всеми потоками данного приложения, а переменная data2 будет у каждого потока своя.

Как избежать одновременного запуска двух копий одного приложения

Такая задача возникает очень часто. Многие, особенно начинающие, пользователи не вполне понимают, что между щелчком по значку приложения и его запуском может пройти несколько секунд, а то и десятков секунд. Они начинают щелкать по значку, запуская все новые копии. Между тем, при работе с базами данных и во многих других случаях иметь более одной копии не только не нужно, но и вредно.

Идея заключается в том, чтобы первая создаваемая копия приложения захватывала некий ресурс, а все последующие при запуске пытались сделать то же самое и в случае неудачи завершались.

Пример такого ресурса - общий блок в файле, отображаемом в память. Поскольку этот ресурс имеет имя, можно сделать его уникальным именно для вашего приложения:

varlin.cjueMappirig: THandle;
FirstWixidcw : THandle;
begin
iMqueyapping := CreateFileMapping($ffffffff, nil, PAGE_readonly, 0, 32, ']УуМар' ) ;
if Ilriqueyapping = 0 then begin
ShowMessage(SysErrorMessage(GetLastError)) ;

Halt; end

else if GetlastError = error_already_exists then begin
FirstWindcw : = FindWindowEx (0, 0, TfmMain.ClassName, nil) ;

if FirstWindcvvOD then

SetForegroundWindow(FirstWindow);
Halt;
end;
// Нет других копий - продолжение Application.Initialize;

Примерно такие строки нужно вставить в начало текста проекта до создания форм. Блок совместно используемой памяти выделяется в системном страничном файле (об этом говорит первый параметр, равный - 1, см. описание функции CreateTileMapping). Его имя - МуМар. Если при создании блока будет ПОЛучеН КОД ОШИбкИ ERROR_already_EXISTs, ЭТО СВИДеТеЛЬСТВуеТ О наличии работающей копии приложения. В этом случае приложение переключает фокус на главную форму другого экземпляра и завершается; в противном случае процесс инициализации продолжается.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Ноябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс