FireDAC. Динамический вывод датасетов в отдельных потоках

Продолжаю практиковаться с потоками в FireDAC. Расширим немного, приложение описанное ранее. Теперь приложение будет уметь не только записывать в базу, но и выводить датасеты в отдельных потоках.

В данной статье подробно опишу вывод датасетов в отдельных потоках на главную форму. В документации сказано, что работа с потоками безопасна, если внутри каждого потока создавать, например, FDConnection, FDQuery, DataSource и синхронизировать вывод на главную форму, например в DBGrid. Что же, проделаем это. Результат получится примерно таким.

30

По нажатию копки будет создаваться поток, внутри которого будут создаваться FDConnection, FDQuery, DataSource и данные будут выводиться на главную форму с синхронизацией с главным потоком.

Начнем!

Структура приложения будет примерно следующей

34

Создадим VCL приложение

31

Здесь у нас панели, на которых кнопки и DBGrid, снизу StatusBar, есть также TopPanel, на которой кнопка вставки записей по технологии ArrayDML.

Создадим также DataModule и добавим на него следующие компоненты

32

Файл FDDrivers.ini

По традиции положим его рядом с EXE и пропишем в нём следующее

 33

 Код MainUnit

Код юнита DataModule

Здесь в OnCreate мы создаем Private определение соединения, которыми будут пользоваться различные FDConnections в потоках. Также, есть дополнительные функции.

Код юнита потока NamesThread

Этот поток будет отвечать за получение следующего датасета

Собственно создание юнита

File > New > Others > Thread Object

Код юнита

Код юнита потока FamiliesThread

Здесь всё по аналогии, выводим фамилии

Код ArrayDMLThreadUnit

Тестируем приложение

Жмем на OpenNames и на OpenFamilies и получаем наши датасеты.

35

Всё работает корректно! Тема для меня показалась не самой простой, особенно сложным был момент с созданием кода для уничтожения старого экземпляра потока, и созданием нового, на примере NamesThread, на кнопке OpenNames это выглядит так…

При этом функции или свойства Terminated для потока извне нет, поэтому для удобства я её дописал. У меня получилось так. Я объявил её в секции public

Но наверное для новых неизученных тем это нормально – сначала что-то кажется трудным, потом же как будто всю жизнь знал))

Второй момент. Переписывание деструкторов. Поскольку компоненты у нас создаются с владельцем nil, то пришлось самому дописывать деструкторы на уничтожение потоков, для NamesThread, например это выглядит так…

Исходники

На всякий случай прикладываю исходник.

269_DynamicDatasets2

Там 2 проекта в ProjectGroup

Тот, который я описал в данной статье называется ProjectDynamicDataSets2

Дамп базы MySQL для тестов

aphina_db_users

 

This entry was posted in Delphi, FireDAC, Без рубрики, Потоки(Threads). Bookmark the permalink.