Відстеження змін в файлової системі і програмування потоків (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, поштовий ящик, опитувати сканер штрихкодів або виконувати інші корисні дії в автоматичному режимі.
Зовнішня компонента з вихідним кодом і тестовою конфігурацією для скачування: