|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Забрать данные из потока
Добрый день
в чем моя беда: создал поток создал компонент MyQuery и MyDataSource в потоке qry_thread создал запрос отправил запрос получил данные связал компоненты MyQuery и MyDataSource созданные в потоке с DBGrid на главной форме вывел результат запроса но я никак не могу оперировать с MyQuery созданном в потоке мне нужно сделать выброс в Excel подскажите, как выщемить этот компонент т.к. форма в которой идет операция по созданию листа Excel и его форматированию, его просто не видит спасибо |
#2
|
||||
|
||||
А вы, сударь, знаете толк в извращениях.
Зачем делать запрос (который требует визуального отображения данных) в потоке? Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
смысл в чем...
запрос на отбор боооооооооольшого количества записей и из кучи таблиц висит это дело минут надцать пользователь думает что прога зависла и хает меня на чем свет стоит вот и решил кинуть запрос в поток чтобы форма в это время сворачивалась и таскалась по экрану а в это время ProgressBar делает мнимое движение А как иначе? |
#4
|
||||
|
||||
а что потом будет делать пользователь с таким большим количеством записей из кучи таблиц? вам его не жалко?) он сможет их "переварить"?
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
мы уходим от темы
Цитата:
лист Excel форматируется особым образом, понятным пользователю куда сливаются итоги, суммы, делается подсветка ячеек с превышением лимита некоторых сумм, и т.д. мне просто нужно получить доступ к созданному в потоке компоненту чтобы перебирать набор данных в нем содержащихся (а что касается DBGrid, - он тоже необходим, так как это требование самого пользователя) |
#6
|
||||
|
||||
объяви MyQuery вне потока.
Пишу программы за еду. __________________ |
#7
|
|||
|
|||
я так и пытался сделать...
только не знаю куда точно написать объявление в общем, пришел к выводу что нужно оперировать вот этими строками: (объявим что к чему и откуда) ThreadQ:qry_thread; MyQuery:TMyQuery; (укажем, что этот гадкий компонет затаился в потоке) ThreadQ.MyQuery:=MyQuery; но куда бы я их не пихал (метод тыка) ничего не выходит я б с радостью эту проблему решил сам, но в инете работа с запросами в потоках - либо копипаст либо что-то из разряда ненаучной фантастики и полусумасшедшего бреда и нигде не описано как использовать полученные данные а ведь это самое главное, ведь от них пользы ни какой, если не можешь ими оперировать |
#8
|
||||
|
||||
Код:
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. Пишу программы за еду. __________________ |
#9
|
|||
|
|||
что-то я не соображаю
это значит поток нужно создать в основном модуле? т.е. не как ThreadObject? стоп, это и есть листинг потока но тогда вопрос, если "Form1.Query1" не будет ли зависания во время запроса? Последний раз редактировалось KristoferRuotsi, 22.03.2012 в 16:29. |
#10
|
||||
|
||||
да какая разница в каком модуле поток описывать - лишь бы он мог дотянуться до Query и DataSource. а их можно и в конструкторе передать при создании потока.
Пишу программы за еду. __________________ |
#11
|
|||
|
|||
ясн... значит нужно попробовать переделать
надо пересмотреть свой крабкодинг 80го лвл буквально с самого начала только еще вопрос: если поток запускается из одной формы (1), где указываются параметры запроса а экспорт в Excel запускается из другой (2), где выбирается вариант форматирования листа есть вариант что вторая (2) форма не увидит компонент в потоке реализованный первой? лучше все кидать на главную? |
#12
|
|||
|
|||
перечитал я свой кодинг
Код:
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
|
||||
|
||||
KristoferRuotsi, я перестал понимать в чем у тебя трудности) в примере показано как выполнять длительный запрос в потоке и потом отобразить результат, т.е. привязать Query к DataSource, который уже привязан к DBGrid. по идее в procedure TQueryThread.DataSource; можно послать сообщение форме через PostMessage (!!!), чтобы сообщить ей что данные готовы.
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 22.03.2012 в 19:50. |
#14
|
|||
|
|||
повторяю:
трудности начнутся когда поток попытается отправить запрос через компонент из основного потока (приложения) или (как у тебя написано в кодинге) на Form1. прога просто зависнет на время исполнения запроса синхронизируй ты не синхронизируй, все равно прога будет висеть во всех статьях что я изучал, при отправке запроса из потока компонент создавался в потоке трудность моя в том, что НИГДЕ не написано как распорядится данными полученными в потоке как дбгрид присоединить к созданному в потоке компоненту я знаю как оперировать свойствами этого компонента? ВОТ В ЧЕМ ТРУДНОСТЬ |
#15
|
|||
|
|||
у меня база весит 27 гигов
серв не могу сказать что крутой, и апргрейда не придвидится запрос на выборку может занимать до 15-20 а то и 40 минут при том что к серву подключены еще около 25 машин, которые беспрерывно посылают запросы вставки/извлечения данных запрос в фоне мне просто необходим |