powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод записей
25 сообщений из 36, страница 1 из 2
Вывод записей
    #40079134
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, подскажите, есть запрос OraQuery, который очень длительно выполняется, возвращая большое число записей,
вопрос как можно на время операции показывать ProgressBar (использовать просто как анимацию)? Без потока не обойтись?
...
Рейтинг: 0 / 0
Вывод записей
    #40079135
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рисование из дочернего потока имеет определённые сложности.
рисуй из основного, а долгоиграющий запрос пускай в потоке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079139
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А никто пример не подскажет ?
...
Рейтинг: 0 / 0
Вывод записей
    #40079141
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Добрый день, подскажите, есть запрос OraQuery, который очень длительно выполняется, возвращая большое число записей,
вопрос как можно на время операции показывать ProgressBar (использовать просто как анимацию)? Без потока не обойтись?

Как правило, хватает Screen.Cursor:=crSqlWait
Трудно представить, когда пользователю нужно большое число записей одновременно. Обычно для этого есть некий фильтр по умолчанию, либо древовидная структура
...
Рейтинг: 0 / 0
Вывод записей
    #40079143
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21.06.2021 13:54, Gerasimenko пишет:
> Как правило, хватает Screen.Cursor:=crSqlWait

+1
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079146
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это правило для тех, кто умеет проектировать БД так, чтобы запросы к ней быстро работали.
С аффтаром не прокатит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079236
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, с потоками не сильно работал, попробовал вывести число выбранных записей после выборки в потоке, но почему-то сам запрос выполняется, а число записей в лейбле Label1 выбранных не показывается по окончании отработки потока:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
constructor TOpenDataSetThread.Create(ACallForm: TCallForm);
begin
  FCallForm := ACallForm;
  FreeOnTerminate := True;
  inherited Create(False);
end;

procedure TOpenDataSetThread.DoProgress;
begin
  if Assigned(FCallForm) then
  begin
    FCallForm.Label2.Caption := FMsg;
  end;
end;

procedure TOpenDataSetThread.Execute;
begin
  inherited;

  FSession := TOracleSession.Create(nil);
  FSession.LogonDatabase := UCons.LogonDatabase;;
  FSession.LogonUsername := UCons.LogonUsername;
  FSession.LogonPassword := UCons.LogonPassword;
  FSession.Connected := True;

  FDataSet :=  TOracleDataSet.Create(nil);
  FDataSet.Session := FSession;
  FDataSet.SQL.Text := 'текст долгого запроса '; 
  FDataSet.OpenRefresh;
  FMsg := 'Выбрано ' + FDataSet.RecordCount.ToString + ' записей';
  Synchronize(DoProgress);
end;

procedure TCallFormFindExecute(Sender: TObject);
var
  DS: TOracleDataSet;
  OpenDataSetThread: TOpenDataSetThread;
begin
  DS := O_DataSet;
  DS.Close;
  DS.Sql.Text := GetSqlText;
  OpenDataSetThread := TOpenDataSetThread.Create(Self);
end;
...
Рейтинг: 0 / 0
Вывод записей
    #40079275
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Из очевидного - FCallForm не задана

а так - отладка все покажет.
...
Рейтинг: 0 / 0
Вывод записей
    #40079280
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747, как не задана, а здесь?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
constructor TOpenDataSetThread.Create(ACallForm: TCallForm);
begin
  FCallForm := ACallForm;
...
end;

OpenDataSetThread := TOpenDataSetThread.Create(Self)?
...
Рейтинг: 0 / 0
Вывод записей
    #40079290
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотри выполнение запроса состоит из этапов:
  • собственно само выполнение
  • выдача результатов
Затем клиент начинает выбирать записи. Можно количество строк вернуть в результатах запроса через оконный count(). При выборе записи срабатывает AfterFetchRecord (только не надо перерисовывать на каждую выбранную строку).
Ещё DOA умеет работать в асинхронном режиме. Посмотри в сторону OracleQuery.Threaded. Тогда будет возможность прервать запрос через OracleSession1.BreakExecution.
...
Рейтинг: 0 / 0
Вывод записей
    #40079330
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня вопрос как из Thread вернуть в главную форму OracleDataSet если поток уничтожается?
...
Рейтинг: 0 / 0
Вывод записей
    #40079347
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто-нибудь подскажет, в потоке создаю свой FDataSet, но мне нужно его наружу как-то передать как выкрутиться?
...
Рейтинг: 0 / 0
Вывод записей
    #40079348
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист мог бы воспользоваться оператором присваивания с соответствующей синхронизацией...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079360
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Программист мог бы воспользоваться оператором присваивания с соответствующей синхронизацией...


Дмитрий, подскажите все же, присвоение данное не помогает и на главной форме нет данных.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TOpenDataSetThread.DoPregress;
begin
  if Assigned(FCallForm) then
  begin
   FCallForm.OracleDataSetMain := FDataSet;
  end;
end;
...
Рейтинг: 0 / 0
Вывод записей
    #40079363
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ты про такое https://delphisources.ru/pages/faq/base/background_db_queries.html ?
...
Рейтинг: 0 / 0
Вывод записей
    #40079366
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterТы про такое

Вообще я про использование мозга, но таки да, код получается в этом роде.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079367
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

в отладке-то пробовали получать результат? Если всё работает и результат есть и он как-бы изменяет Caption у метки, но в главной форме этого не видно, то, возможно, необходимо сказать метке, чтобы она перерисовалась. К примеру Label2.Invalidate...
...
Рейтинг: 0 / 0
Вывод записей
    #40079374
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45, результата в гриде нет, а в метке все отображается по окончании работы потока, проблема в другом,
теперь как мне открытый в потоке FDataSet передать наверх чтобы он отображался в главном окне программы?
...
Рейтинг: 0 / 0
Вывод записей
    #40079376
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster, скажите, а как-то можно сделать DataSetы потока и главной формы разными? Или можно один передавать в поток?
...
Рейтинг: 0 / 0
Вывод записей
    #40079378
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.06.2021 15:40, wsnet пишет:
> теперь как мне открытый в потоке FDataSet передать наверх чтобы он отображался в главном окне программы?

не надо его создавать в потоке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079382
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
теперь как мне открытый в потоке FDataSet передать наверх чтобы он отображался в главном окне программы?
Теоретически задача решается тезисом "поток не создает и не удаляет соединение и датасет, а пользуется тем, что дают". А практически проще скопировать полученные записи в другое хранилище
...
Рейтинг: 0 / 0
Вывод записей
    #40079383
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.06.2021 15:55, _Vasilisk_ пишет:
> А практически проще скопировать полученные записи в другое хранилище

зачем?
тем более, что у ТС "многие мульёны" записей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079384
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
зачем?
Чтобы не отвезывать датасет от датасорса на момент заполнеия, чтобы не контролировать, что одновременно не запущено несколько потоков по разным запросам. Чтобы не думать как данные отобразить в соседней транзакции, если ТС задумает их редактировать. В общем граблей много
Мимопроходящий
тем более, что у ТС "многие мульёны" записей
Я даже не буду спрашивать зачем мульёны записей в гриде. Если ТС изначально пошел по неправильному пути, то теперь уже не до оптимизации. Теперь нужно минимизировать количество граблей
...
Рейтинг: 0 / 0
Вывод записей
    #40079385
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.06.2021 16:03, _Vasilisk_ пишет:
> Теперь нужно минимизировать количество граблей

создавать объекты VCL и цепляться к СУБД не в основном потоке - плохая идея.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод записей
    #40079388
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
цепляться к СУБД не в основном потоке - плохая идея.
Хорошая. Если к соединению будет одновременный доступ только из одного потока.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывод записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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