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

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

+1
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.06.2021, 14:06
    #40079146
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
Это правило для тех, кто умеет проектировать БД так, чтобы запросы к ней быстро работали.
С аффтаром не прокатит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.06.2021, 22:28
    #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
22.06.2021, 09:45
    #40079275
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
wsnet,

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

а так - отладка все покажет.
...
Рейтинг: 0 / 0
22.06.2021, 10:09
    #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
22.06.2021, 11:22
    #40079290
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
Смотри выполнение запроса состоит из этапов:
  • собственно само выполнение
  • выдача результатов
Затем клиент начинает выбирать записи. Можно количество строк вернуть в результатах запроса через оконный count(). При выборе записи срабатывает AfterFetchRecord (только не надо перерисовывать на каждую выбранную строку).
Ещё DOA умеет работать в асинхронном режиме. Посмотри в сторону OracleQuery.Threaded. Тогда будет возможность прервать запрос через OracleSession1.BreakExecution.
...
Рейтинг: 0 / 0
22.06.2021, 13:03
    #40079330
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
У меня вопрос как из Thread вернуть в главную форму OracleDataSet если поток уничтожается?
...
Рейтинг: 0 / 0
22.06.2021, 14:28
    #40079347
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
кто-нибудь подскажет, в потоке создаю свой FDataSet, но мне нужно его наружу как-то передать как выкрутиться?
...
Рейтинг: 0 / 0
22.06.2021, 14:31
    #40079348
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
Программист мог бы воспользоваться оператором присваивания с соответствующей синхронизацией...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.06.2021, 14:59
    #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
22.06.2021, 15:04
    #40079363
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод записей
Dimitry Sibiryakov,

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

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

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

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

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

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


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