Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
istrebitel>Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет

В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде. Разве что в кэш в фоне потихоньку данные набирать, чтобы потом ими пользоваться, не обращаясь к базе.
9 фев 21, 09:19    [22277841]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
Подчиненный датасет должен обновляться мгновенно, ведь он ограничен значением мастер-ключа. Что у вас там тормозит.

2 с половиной секунды, причем зависит от количества записей. 5 записей - 1,5 секунды, 10 - 2,5 и т.д.
SELECT cc.*, 
(@rownum := @rownum + 1) AS rownum, 
contract_number, contract_date, cown.contragent_full_name AS cargo_owner_name, 
cargo_nomenclature_code, cargo_nomenclature_name, cargo_mark_name, cargo_mark_description, container_type_name, container_weight,
cargo_size, cargo_fraction_name, cc.conosament_number, vessel_act_number, general_act_number, 
sender.contragent_full_name AS sender_name, receiver.contragent_full_name AS receiver_name, consignment_number,
IF(cc.pauzka = 'Y', 'ДА', 'НЕТ') AS pauzka_rus,
IF(cc.cooperated = 'Y', 'ДА', 'НЕТ') AS cooperated_rus,
(CASE `c`.`cargo_status` 
WHEN 'export' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (Э)') 
WHEN 'import' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (И)') 
WHEN 'domestic' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (К)') 
ELSE `cn`.`cargo_nomenclature_name` end) AS `cargo_nom_rus`, 
(IF (((contract_date = '1899-12-30') OR (contract_date IS NULL)),
'00.00.0000', DATE_FORMAT(contract_date, '%d.%m.%Y'))) AS contract_date_rus, 
IF((MAX(COALESCE(tex.from_cargo_card_id, tex.to_cargo_card_id)) IS NOT NULL) AND (MIN(COALESCE(tex.transshipment_finish_time, '1899-12-30')) > '1899-12-30'), 'Y', 'N') all_tr_finished 
FROM cargo_card cc 
INNER JOIN vessel_cargo_card vcc ON vcc.id = cc.id 
JOIN (select @rownum := 0) AS r
INNER JOIN contract_cargo_sub ccs ON ccs.id = cc.contract_cargo_sub_id
INNER JOIN contract_cargo_consignment ccc ON ccc.id = ccs.contract_cargo_consignment_id 
INNER JOIN consignment cons ON cons.id = ccc.consignment_id 
INNER JOIN contract_cargo_head cch ON cch.id = ccc.contract_cargo_head_id
INNER JOIN contract c ON c.id = cch.contract_id 
INNER JOIN cargo_nomenclature cn ON cn.id = cch.cargo_id 
LEFT JOIN container_type ct ON ct.id = cch.container_type_id 
LEFT JOIN container_weight_type cwt ON cwt.id = ccs.container_weight_type_id 
LEFT JOIN cargo_fraction cf ON cf.id = ccs.cargo_fraction_id 
LEFT JOIN cargo_mark cm ON cm.id = ccs.cargo_mark_id 
LEFT JOIN cargo_sort cs ON cs.id = ccs.cargo_sort_id 
LEFT JOIN contragent cown ON cown.id = c.contragent_id 
LEFT JOIN contragent sender ON sender.id = cc.sender_id 
LEFT JOIN contragent receiver ON receiver.id = cc.receiver_id 
LEFT JOIN transshipment tex ON cc.id IN (tex.from_cargo_card_id, tex.to_cargo_card_id) 
WHERE vcc.plan_vessel_id = :plan_vessel_id 
GROUP BY cc.id
9 фев 21, 10:44    [22277913]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
istrebitel>Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет

В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде. Разве что в кэш в фоне потихоньку данные набирать, чтобы потом ими пользоваться, не обращаясь к базе.

Не ускорить отображение, а убрать зависание на скроллинге, когда сделал паузу, начался дочерний запрос, и снова нажал скроллинг.
9 фев 21, 10:47    [22277915]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
istrebitel
Member

Откуда:
Сообщений: 123
ъъъъъ
В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.

Здесь есть нюанс, в зависимости от использованного драйвера и способа заполнения основного грида.
Некоторые драйверы, в определённых режимах CursorKind, не дадут обращаться к БД пока полностью не дофетчится (например MsSQL при CursorKind = ckAutomatic и не установленном NativeClient будет сыпать ошибками raised exception class EMSSQLNativeException with message '[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt'. при CursorKind = ckDynamic работать будет, но медленнее).
FireDAC вроде как выстраивает в очередь запросы, так что подлагивания будут при скроле вниз, при фетчинге очередной порции. Можно сделать чтобы это было пореже установив RowsetSize побольше, а если RowsetSize будет больше, чем количество строк, то фетч будет только один, при открытии датасета.

ъъъъъ
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.

Поможет избавиться от
svnvlad
Если момент скроллинга попадает на начало перерисовки нижней сетки, то происходит зависание до конца перерисовки. Раньше на каждую запись зависало, теперь только в этом случае.

Допустим запрос из БД занимает 1 секунду, а отрисовка 50 миллисекунд. Когда сработал таймер запрос, выполняющийся в главном потоке, парализует скролинг. Если запрос выполнять в отдельном потоке, то скролинг будет парализоваться только на время отрисовки грида, в момент прицепления его к DataSource. А это скорее всего меньший интервал. Но надо тестить.
ъъъъъ
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде.

Метод не ускорит отображение в детайле, метод уменьшит тормоза при скролинге в мастере.
С MemTable даже без отцепления грида работает.

К сообщению приложен файл (EventThread.zip - 6Kb) cкачать
9 фев 21, 11:33    [22277944]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15029
svnvlad
OnDataChange


Может, назначать событие после открытия формы, а OnShow/onActivate?
9 фев 21, 12:42    [22278008]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
svnvlad
Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
Что за бред? Может вы нам забыли сказать, что после открытия формы вы сами пробегаетесь по всем записям?
9 фев 21, 14:39    [22278156]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
_Vasilisk_
svnvlad
Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
Что за бред? Может вы нам забыли сказать, что после открытия формы вы сами пробегаетесь по всем записям?

Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.
Если только RecordCount не вызывает такое поведение.
EndOfQuery := (ADQueryPlans.RecordCount = 0) or (ADQueryPlans.RecordCount < ThisLimit);


Сообщение было отредактировано: 9 фев 21, 15:18
9 фев 21, 15:23    [22278202]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
svnvlad
Если только RecordCount не вызывает такое поведение.
Чему равно ADQueryPlans.FetchOptions.RecordCountMode?
9 фев 21, 20:33    [22278459]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
_Vasilisk_
svnvlad
Если только RecordCount не вызывает такое поведение.
Чему равно ADQueryPlans.FetchOptions.RecordCountMode?

cmVisible
10 фев 21, 03:48    [22278565]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64865
Блог
svnvlad
Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.

А "сетка", небось, девэкспрессовская.
10 фев 21, 05:56    [22278578]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
softwarer
svnvlad
Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.

А "сетка", небось, девэкспрессовская.

Да.
11 фев 21, 00:34    [22279221]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ma1tus
Member

Откуда:
Сообщений: 766
svnvlad
softwarer
пропущено...

А "сетка", небось, девэкспрессовская.

Да.

4084037
11 фев 21, 02:49    [22279234]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
cptngrb
Member

Откуда:
Сообщений: 663
если сетка DevExpress, то я вешаю на событие DataSource.OnUpdate и TableView.OnSelectionChanged. Вроде проблем не было, но мне больше нравиться сетка EhLib а там DataSource.onDataChange
11 фев 21, 08:44    [22279288]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
cptngrb
мне больше нравиться сетка EhLib а там DataSource.onDataChange

Мне тоже раньше больше нравилась, более простая, понятная, но сейчас вижу недостатки, например: при обновлении сетки и Locate на прежнюю запись происходит скроллинг записи в самый верх сетки. В DevExpress запись остается посередине экрана, где и была.
17 фев 21, 01:46    [22282016]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить