Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2012, 12:37
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию Забрать данные из потока

Добрый день

в чем моя беда:
создал поток
создал компонент MyQuery и MyDataSource в потоке qry_thread
создал запрос
отправил запрос
получил данные
связал компоненты MyQuery и MyDataSource созданные в потоке с DBGrid на главной форме
вывел результат запроса

но я никак не могу оперировать с MyQuery созданном в потоке
мне нужно сделать выброс в Excel

подскажите, как выщемить этот компонент
т.к. форма в которой идет операция по созданию листа Excel и его форматированию, его просто не видит

спасибо
Ответить с цитированием
  #2  
Старый 22.03.2012, 12:42
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А вы, сударь, знаете толк в извращениях.
Зачем делать запрос (который требует визуального отображения данных) в потоке?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 22.03.2012, 14:34
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

смысл в чем...
запрос на отбор боооооооооольшого количества записей
и из кучи таблиц

висит это дело минут надцать
пользователь думает что прога зависла и хает меня на чем свет стоит
вот и решил кинуть запрос в поток
чтобы форма в это время сворачивалась и таскалась по экрану
а в это время ProgressBar делает мнимое движение

А как иначе?
Ответить с цитированием
  #4  
Старый 22.03.2012, 14:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а что потом будет делать пользователь с таким большим количеством записей из кучи таблиц? вам его не жалко?) он сможет их "переварить"?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 22.03.2012, 15:23
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

мы уходим от темы

Цитата:
но я никак не могу оперировать с MyQuery созданном в потоке
мне нужно сделать выброс в Excel

подскажите, как выщемить этот компонент
т.к. форма в которой идет операция по созданию листа Excel и его форматированию, его просто не видит

лист Excel форматируется особым образом, понятным пользователю
куда сливаются итоги, суммы, делается подсветка ячеек с превышением лимита некоторых сумм, и т.д.

мне просто нужно получить доступ к созданному в потоке компоненту
чтобы перебирать набор данных в нем содержащихся

(а что касается DBGrid, - он тоже необходим, так как это требование самого пользователя)
Ответить с цитированием
  #6  
Старый 22.03.2012, 15:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

объяви MyQuery вне потока.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 22.03.2012, 15:49
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

я так и пытался сделать...

только не знаю куда точно написать объявление

в общем, пришел к выводу что нужно оперировать вот этими строками:

(объявим что к чему и откуда)
ThreadQ:qry_thread;
MyQuery:TMyQuery;
(укажем, что этот гадкий компонет затаился в потоке)
ThreadQ.MyQuery:=MyQuery;

но куда бы я их не пихал (метод тыка) ничего не выходит
я б с радостью эту проблему решил сам, но в инете работа с запросами в потоках - либо копипаст либо что-то из разряда ненаучной фантастики и полусумасшедшего бреда
и нигде не описано как использовать полученные данные
а ведь это самое главное, ведь от них пользы ни какой, если не можешь ими оперировать
Ответить с цитированием
  #8  
Старый 22.03.2012, 16:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, Grids, DBGrids;

type
  TQueryThread = class(TThread)
  private
    procedure DataSource;
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Query1: TQuery;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TQueryThread.DataSource;
begin
  Form1.DataSource1.DataSet:=Form1.Query1;
end;

procedure TQueryThread.Execute;
begin
  Form1.Query1.Open;
  Synchronize(DataSource);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Query1.DatabaseName:='DBDEMOS';
  Query1.SQL.Text:='select * from country.db';
  with TQueryThread.Create(True) do
  begin
    FreeOnTerminate:=True;
    Resume;
  end;
end;

end.
Вложения
Тип файла: rar TQueryThread.rar (2.0 Кбайт, 4 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 22.03.2012, 16:20
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

что-то я не соображаю
это значит поток нужно создать в основном модуле?
т.е. не как ThreadObject?

стоп, это и есть листинг потока
но тогда вопрос, если "Form1.Query1" не будет ли зависания во время запроса?

Последний раз редактировалось KristoferRuotsi, 22.03.2012 в 16:29.
Ответить с цитированием
  #10  
Старый 22.03.2012, 16:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да какая разница в каком модуле поток описывать - лишь бы он мог дотянуться до Query и DataSource. а их можно и в конструкторе передать при создании потока.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 22.03.2012, 17:55
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

ясн... значит нужно попробовать переделать
надо пересмотреть свой крабкодинг 80го лвл буквально с самого начала

только еще вопрос:

если поток запускается из одной формы (1), где указываются параметры запроса

а экспорт в Excel запускается из другой (2), где выбирается вариант форматирования листа

есть вариант что вторая (2) форма не увидит компонент в потоке реализованный первой?

лучше все кидать на главную?
Ответить с цитированием
  #12  
Старый 22.03.2012, 19:10
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

перечитал я свой кодинг

Код:
 MyDataSource:=TMyDataSource.Create(nil);
 MyDataSource.DataSet:=MyQuery;
 Form1.DBGridEh2.DataSource:=MyDataSource;
 Form1.DBGridEh3.DataSource:=MyDataSource;
 Form4.Close;
 Form1.sTabSheet2.Show;

это есть, иначе данных не увидишь

второе, даже если мы будем в потоке обращаться к компоненту который находится на главной форме, все равно будет зависание

а если запрос обрабатывается 30 минут
все эти 30 минут будет висяк

тут надо с точностью до наоборот -> нужно чтобы приложение дотянулось до компонента созданного в потоке, а не наоборот

Последний раз редактировалось KristoferRuotsi, 22.03.2012 в 19:15.
Ответить с цитированием
  #13  
Старый 22.03.2012, 19:47
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

KristoferRuotsi, я перестал понимать в чем у тебя трудности) в примере показано как выполнять длительный запрос в потоке и потом отобразить результат, т.е. привязать Query к DataSource, который уже привязан к DBGrid. по идее в procedure TQueryThread.DataSource; можно послать сообщение форме через PostMessage (!!!), чтобы сообщить ей что данные готовы.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 22.03.2012 в 19:50.
Ответить с цитированием
  #14  
Старый 23.03.2012, 11:54
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

повторяю:

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

во всех статьях что я изучал, при отправке запроса из потока
компонент создавался в потоке

трудность моя в том, что НИГДЕ не написано как распорядится данными полученными в потоке
как дбгрид присоединить к созданному в потоке компоненту я знаю

как оперировать свойствами этого компонента?

ВОТ В ЧЕМ ТРУДНОСТЬ
Ответить с цитированием
  #15  
Старый 23.03.2012, 12:00
KristoferRuotsi KristoferRuotsi вне форума
Прохожий
 
Регистрация: 14.05.2011
Сообщения: 36
Репутация: 10
По умолчанию

у меня база весит 27 гигов
серв не могу сказать что крутой, и апргрейда не придвидится
запрос на выборку может занимать до 15-20 а то и 40 минут
при том что к серву подключены еще около 25 машин, которые беспрерывно посылают запросы вставки/извлечения данных

запрос в фоне мне просто необходим
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter