Подтвердить что ты не робот

В Delphi есть потоки TDataSet?

Я хотел бы иметь возможность открывать TDataSet асинхронно в своем собственном потоке, чтобы поток основного VCL мог продолжаться до тех пор, пока это не закончится, а затем последует чтение основного потока VCL из этого TDataSet. Я экспериментировал и попал в очень странные ситуации, поэтому мне интересно, сделал ли кто-нибудь это раньше.

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

Я делаю Win32-программирование в Delphi 7, используя TmySQLQuery из DAC для MySQL в качестве моего потомка TDataSet.

4b9b3361

Ответ 1

Если вы хотите использовать набор данных только в своем потоке, вы можете просто использовать синхронизацию для связи с основным потоком для любого обновления VCL/UI, например, с любым другим компонентом.
Или, лучше, вы можете реализовать связь между потоками mainthread и worker с собственной системой обмена сообщениями.

проверить решение Hallvard для нарезки здесь:
http://hallvards.blogspot.com/2008/03/tdm6-knitting-your-own-threads.html

или этот другой:
http://dn.codegear.com/article/22411

для некоторых объяснений по синхронизации и ее неэффективности:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

Ответ 2

Я видел это с другими реализациями TDataSet, а именно в компонентах Asta. Они будут обращаться к серверу, немедленно возвращаться, а затем запускать событие после загрузки данных.

Однако, я считаю, что это сильно зависит от компонента. Например, те же самые компоненты Asta не могли быть открыты синхронно ничем, кроме основного потока VCL.

Короче говоря, я не считаю, что это ограничение TDataSet как таковое, а скорее специфическое для реализации, и у меня нет доступа к указанным вами компонентам.

Ответ 3

Одна вещь, о которой нужно помнить об использовании одного и того же TDataSet между несколькими потоками, - это только чтение текущей записи в любой момент времени. Поэтому, если вы читаете запись в одном потоке, а затем другой поток вызывает Далее, тогда у вас проблемы.

Ответ 4

Также помните, что для потока, скорее всего, потребуется собственное подключение к базе данных. Я считаю, что здесь нужен многопоточный "удерживающий" объект для загрузки данных из потока в (только для записи), который затем считывается только из основного потока VCL. Перед чтением используйте какой-то метод синхронизации, чтобы убедиться, что вы не читаете тот же момент, когда пишете, или записываете тот же момент своего чтения, или загружаете все в файл памяти, и пишите метод синхронизации, чтобы сообщить основному приложению, где в файле прекратить чтение.

Я использовал последний подход несколько раз, полагаясь на количество ожидаемых записей (и размер набора данных), я даже сделал это в файле физического диска в локальной системе. Он работает достаточно хорошо.

Ответ 5

Я сделал многопоточный доступ к данным, и это не просто:

1) Вам нужно создать сеанс для каждого потока.

2) Все, что сделано для этого экземпляра TDataSet, должно выполняться в контексте потока, в котором он был создан. Это непросто, если вы хотите разместить, например. сетку db поверх нее.

3) Если вы хотите разрешить, например, основной поток играет с вашими данными, прямолинейное решение состоит в том, чтобы переместить его в отдельный контейнер какого-либо типа, например. набор данных памяти.

4) Вам понадобится какой-то механизм сигнализации для уведомления основного потока после завершения поиска данных.

... и обработка исключений не является простой, либо...

Но: как только вы преуспеете, приложение будет действительно изящным!

Ответ 6

Большинство TDatasets не являются потокобезопасными. Тот, который я знаю, является потокобезопасным, kbmMemtable. Он также имеет возможность клонировать набор данных, чтобы проблема перемещения указателя записи (как объяснил Джим МакКит). Они являются одним из лучших наборов данных, которые вы можете получить (купили или бесплатно).