Это не относится к DbExpress (с которым у меня нет опыта), но лучшая идея для переноса некоторой функциональности в фоновый поток - сначала разработать ее в основном потоке, отладить ее, и как только вы убедитесь, что это так. хорошо, затем переместите его.
Что вы можете сделать, это поместить все в TDataModule. Если модуль данных может работать сам по себе, не требуя других компонентов в других формах или модулях данных, и вы создаете его в фоновом потоке, то вы можете быть совершенно уверены, что все будет работать. Вам не нужно клонировать соединение, так как оно будет создано и уничтожено в том же потоке, где осуществляется весь доступ к базе данных.
Несколько важных советов по работе с базами данных с фоновыми потоками:
Обрабатывайте все исключения, поскольку необработанные исключения во вторичном потоке могут привести к сбою вашего приложения. Обработка исключений в объекте Application не будет работать для вас.
Не получить доступ к чему-либо в потоке GUI. Это означает, что наиболее важно, что TDataSource не может использоваться и никакие чувствительные к данным элементы управления не могут быть использованы.
Если используемые вами компоненты что-либо делают с SendMessage или PostMessage, вам придется создать стандартный цикл сообщений в фоновом потоке.
Если используемые вами компоненты что-то делают с OLE, вызовите OleInitialize () и OleUnitialize () в контексте фонового потока.
Если вы хотите облегчить свою жизнь, рассмотрите возможность использования OmniThreadLibrary или AsyncCalls . Какой из них зависит от того, как долго будут работать ваши фоновые соединения с базой данных и хотите ли вы использовать их повторно.