powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заполнение несколькоких списков в отдельных потоках
23 сообщений из 48, страница 2 из 2
Заполнение несколькоких списков в отдельных потоках
    #39963956
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Если перенести строки

Переносить нужно тоже с умом... Покажи хоть.

ЗЫ. Из потока вообще не лезь к визуальной части. Всё это лишнее.
X11
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        lc := TdxLayoutControl(clb.Parent);
        li := lc.FindItem(clb.Handle);
        if not LayoutItemVisible(li) then exit;


        //если список уже заполнен, то нет смысла заполнять повторно
        if  clb.Items.Count > 0 then exit;

        clb.Items.BeginUpdate;
        //try
          clb.EditValueFormat := cvfIndices;



А это вообще можно делать до запуска потока:
X11
Код: pascal
1.
if  clb.Items.Count > 0 then exit;



Оставь в потоке только создание соединения, выполнение запроса и заполнение TStringList.
Далее отдашь через синхронизацию этот список для заполнения списка контрола и после уже можно всё зачищать.
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39963968
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Покажи хоть.


не понял, что именно показать?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39963970
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Оставь в потоке только создание соединения


а я не создаю в потоке никаких соединений, я думаю, что это не обязательно
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39963976
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Оставь в потоке только создание соединения, выполнение запроса и заполнение TStringList.


тогда получится два цикла
1. Заполнение TStringList.
2. Заполнение TcxCheckComboBox из TStringList.

стоит ли овчинка выделки?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39963997
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
В общем, почитал тему 21139822 , переделал так
пока хотя бы без ошибок


А какую роль выполняет TThread.Synchronize в этом коде?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964008
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, какую?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964009
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
стоит ли овчинка выделки?

Естественно. В 1-ой обращение к БД, 2-я операция заметно быстрее.

X11
а я не создаю в потоке никаких соединений, я думаю, что это не обязательно

X11
то вываливает несколько AV и ошибок, в том числе и при закрытии формы

Удивительное упорство...
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964013
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
да, какую?


Никакой роли он здесь не выполняет. Его есть смысл вызывать только из доп. потока. А в последнем варианте доп.поток исчез.
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964029
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Оставь в потоке только создание соединения, выполнение запроса и заполнение TStringList.


если работа с БД будет в отдельном потоке, то в итоге визульный список не заполнится...

вот как получается:
запускаем отдельный поток, где создаем соединение, датасет, обращаемся к базе и наполняем StringList
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
task := TTask.Create(procedure ()
    begin
      sl := TStringList.Create;

      db := dm.CloneDataBase;// создаем БД
      tr := dm.CreateTransRead(db);// создаем транзакцию
      tr.DefaultDatabase := db;
      db.DefaultTransaction := tr;
      qr := dm.CreateFibQuery;// создаем датасет
      qr.Owner := db;// чтобы при удалении БД, удалился и датасет
      qr.Transaction := tr;
      qr.SQL.Text := sql;
      qr.ParamByName('table1').Value := .....;
      qr.ExecQuery;
      While not qr.Eof do
      begin
        sl.add(qr.Fields[0].AsString);
        qr.Next;
      end;//while
      qr.close;

    end);
task.Start;// запуск отдельного потока



после task.Start программа ждать не будет и сразу перейдет к циклу заполнения визуального списка из TStringList`а. А TStringList пока ещё наполняется из базы в отдельном потоке...

как быть?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964032
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11как быть?

Выкинуть из картины StringList. В потоке получил строку - отослал её главному потоку на
показание, читаешь следующую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964034
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
отослал её главному потоку на
показание


Чуть больше модно информации?
Куда именно отправять, как? С помощью какого функционала, Messages?
Нужно создать ещё какую-то процедуру, которая будет ловить эти строки в главном потоке и заполнять визуальные списки?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964040
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
В потоке получил строку - отослал её главному потоку
Правиьно, но геморройно. В идеале нужно отсылать асинхронно, а со строками нужно не запутаться со ссылками
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964041
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, лучше оставить как было
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964044
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Куда именно отправять, как?

Туда, где эти данные нужны и так как это место готово их принимать.

X11С помощью какого функционала, Messages?

Если эти твои "списки" собираются для отображения в GUI - да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964052
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11В общем, лучше оставить как было

Да, "работает - не трогай" для чайников всегда актуально.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964088
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
как быть?

Тут и можешь дернуть синхронизацию, после закрытия запроса.
Операция на фоне остального минимальная по времени.
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964341
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование дополнительных потоков для параллельной загрузки данных из БД даст положительный эффект, например, в следующих случаях:
1) база данных удалённая, большое время тратится на ожидание отправки и приёма запросов. 2) база данных локальная, но хранится на HDD, данные ещё не загружены в кэш в ОЗУ и сильно фрагментированы. При сборе фрагментированных данных по всей поверхности HDD может уйти уйма времени. Каково будет в этом сценарии ускорение от параллельной загрузки данных не могу сказать, как повезёт.
3) SQL-запросы написаны плохо, либо в базе данных не хватает индексов для быстрого поиска. Т.е. запросы выполняются долго. При этом СУБД способна такие запросы выполнять параллельно.

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

Очень важный момент: параллельная загрузка в каждом потоке должна выполняться через отдельное подключение к базе данных. При этом, если эти подключения создавать каждый раз заново в доп. потоках, то на создание подключений может уйти времени больше, чем на загрузку списков. Подключения должны быть созданы заранее. Для этого следует использовать пул готовых подключений.
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964350
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Очень важный момент: параллельная загрузка в каждом потоке должна выполняться через отдельное подключение к базе данных


И не важно, какая библиотека доступа?
А может FibPlus и/или DevArt потокобезопасны...
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964352
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Подключения должны быть созданы заранее. Для этого следует использовать пул готовых подключений.


Вот у TUniConnection (UniDAC DevArt) есть свойство PoolingOptions.
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964361
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11А может FibPlus и/или DevArt потокобезопасны...

Потокобезопасность тут ни при чём. СУБД должна поддерживать асинхронное API иначе сквозь
одно соединение больше данных не пропихнуть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964382
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Firebird 3, я надеюсь, поддерживает?
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964385
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Firebird 3, я надеюсь, поддерживает?

Нет. Полная сериализация вызовов в рамках коннекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнение несколькоких списков в отдельных потоках
    #39964507
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

можно многими потоками данные из базы извлекать через несколько соединений. это скорее всего будет быстрее. поможет ли это заполнить форму быстрее - сложный вопрос, потому как мне кажется что основные тормоза у тебя будут не с базой.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заполнение несколькоких списков в отдельных потоках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]