В Delphi действительно ли TDataSet ориентирован на многопотоковое исполнение?

Из MSDN, Math.Round (double a) возвращается:

Целое число, ближайшее a. Если дробная составляющая a находится на полпути между двумя целыми числами, одна из которых четная, а другая нечетная, то возвращается четное число.

blockquote>

... и поэтому 2.5, находясь на полпути между 2 и 3, округляется до четного числа (2). это называется округлением Banker (или округлым до четности) и является обычно используемым стандартом округления.

То же самое в статье MSDN:

] Поведение этого метода следует за стандартом IEEE 754, раздел 4. Этот вид округления иногда называется округлением до ближайшего или округления банкира. Это минимизирует ошибки округления, которые возникают из-за постоянного округления среднего значения в одном направлении.

blockquote>

Вы можете указать другое поведение округления, вызвав перегрузки Math.Round, которые принимают режим MidpointRounding .

12
задан LU RD 27 November 2011 в 19:02
поделиться

6 ответов

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

проверьте решение 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

5
ответ дан 2 December 2019 в 21:04
поделиться

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

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

Таким образом короче говоря, я не полагаю, что это - ограничение TDataSet по сути, а скорее чего-то, что является конкретной реализацией, и у меня нет доступа к компонентам, которые Вы упомянули.

3
ответ дан 2 December 2019 в 21:04
поделиться

Одна вещь иметь в виду об использовании того же TDataSet между несколькими потоками является Вами, может только считать текущую запись в любой момент времени. Таким образом, если Вы читаете запись в одном потоке, и затем другой поток звонит Затем затем, Вы в беде.

3
ответ дан 2 December 2019 в 21:04
поделиться

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

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

2
ответ дан 2 December 2019 в 21:04
поделиться

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

1) Необходимо создать сессию на поток.

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

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

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

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

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

1
ответ дан 2 December 2019 в 21:04
поделиться

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

0
ответ дан 2 December 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: