Відстеження змін в файлової системі і програмування потоків (threads), книга знань

Відстеження змін в файлової системі і програмування потоків (threads)


Ключові слова: Зовнішня компонента, Delphi, потік, thread, TThread, опитування директорії, відстеження змін в файлах, FindFirstChangeNotification, WaitForSingleObject

Відстеження змін в директорії


При реалізації обміну між програмами часто потрібно проінформувати приймаючу систему (в нашому випадку, 1С: Підприємство) про те, що файли прийшли, і їх пора приймати.

Як варіант, можна сканувати папку в процедурі обробки очікування (наприклад, робити це кожні N секунд).

Інший, мабуть, більш правильний спосіб - використовувати системні функції FindFirstChangeNotification, FindNextChangeNotification і FindCloseChangeNotification з Windows API (аналогічні функції є і в ОС Unix). В даному випадку, оповіщення про зміну у файловій системі виконує ядро ​​ОС, і не треба "проробляти дірку" на жорсткому диску постійними до нього зверненнями.

Що ми робимо з коду 1С


Після такої ініціалізації в процедуру ОбработкаВнешнегоСобитія 1С буде приходити сповіщення про зміну, в даному прикладі, папки "c:". Якщо встановити параметр vk.ОтслежіватьПодкаталогі = 1, то ще й вкладених папок. Відслідковуватися будуть тільки зміни в іменах файлів (наприклад, поява нового файлу в директорії), але не зміна змісту файлів.

Щоб припинити опитування змін до директорії, доступна функція

Процедура потоку в Delphi


Процедура генерує події (ExternalEvent), як тільки виявить зміни у зазначеній папці файлової системи. Параметр FILE_NOTIFY_CHANGE_FILE_NAME вказує на необхідність контролювати імена файлів. Див. Довідку по WinAPI (наприклад, на диску MSDN), щоб дізнатися, які варіанти цього параметра є ще.

ініціалізація потоку


Для потоку я визначаю окремий клас, успадкований від TThread.

Конструктор класу описаний таким чином:


Об'єкт зовнішньої компоненти містить поле MyThread (тип - TThread).

У методі ВК я не започатковано змінну потоку так:


У цей момент починає виконуватися наша процедура потоку:
procedure TMyThread.Execute;

І виконується вона до тих пір, поки я не дам команду потоку зупинитися:

Потік може зловити ситуацію, що його хочуть завершити, прочитавши властивість Terminated:


Виклик MyThread.WaitFor чекає, коли потік завершить свою роботу, після чого змінну можна руйнувати - MyThread.Destroy.

висновок


Ми розглянули роботу з потоком виконання у зовнішній компоненті 1С: Підприємство.
Потік виконує корисну дію - відстежує зміну файлів в директорії.
Ви можете змусити потік робити щось інше: наприклад, опитувати FTP, поштовий ящик, опитувати сканер штрихкодів або виконувати інші корисні дії в автоматичному режимі.



Зовнішня компонента з вихідним кодом і тестовою конфігурацією для скачування:

Схожі статті