Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача данных запроса к БД из потока [D6, IB6.x, FireBird]


Страницы:   1 2 3

galexis ©   (2004-09-06 13:46:00) 

Пытаюсь работать с потоками (TThread). В потоке выполняется запрос к БД FireBird. А что делать с набором данных после этого не знаю. Как передать их в основной поток? Сейчас провожу эксперименты с SendMessage, но думаю что это не выход, да и с ним у меня пока еще ничего не вышло. Приложение у меня MDI, а поток создается из дочернего окна. Как обратиться к элементу редактирования TEdit, который расположен в таком окне?
Помогите разобраться пожалуйста.


Анонимщик   (2004-09-06 17:19:00) [21]

Интересно, что ты с ним делать будешь?

var
 IBBackQ: TIBBackGroundQuery;
begin
 IBBackQ := TIBBackGroundQuery.Create('127.0.0.1:c:\1.gdb', nil, 'select g from alexis', MyDS);


galexis   (2004-09-06 17:12:00) [22]


> Анонимщик ©   (06.09.04 16:58) [34]

Только не убивайте..
Можно теперь кусочек кода создания этого потока?


galexis   (2004-09-06 17:03:00) [23]


> Digitman ©

Так и есть, кушать хочется!


Анонимщик   (2004-09-06 16:58:00) [24]

Как ты все же утомил всех:

unit IBBackGroundQuery;

interface

uses
 Classes, IBDataBase, IBQuery, SysUtils, Messages, Forms, DB, Windows;

type
 TIBBackGroundQuery = class(TThread)
 private
   { Private declarations }
   FDBName      : String;
   FSQLString   : String;
   FDBParams    : TStringList;

   FIBDB        : TIBDataBase;
   FIBT         : TIBTransaction;
   FIBQSequences: TIBQuery;
   FDS          : TDataSource;
   FQueryException: Exception;

   // обработка исключения, связанного с ошибкой выполнения запроса
   procedure ShowQryError;
   procedure ConnectDataSource;
 protected
   procedure Execute; override;
 public
   constructor Create(ADBName: String; ADBParams: TStrings;
                      const ASQLString: String; const ADS: TDataSource); virtual;
   destructor Destroy; override;
 end;

implementation

{ Important: Methods and properties of objects in VCL or CLX can only be used
 in a method called using Synchronize, for example,

     Synchronize(UpdateCaption);

 and UpdateCaption could look like,

   procedure TIBBackGroundQuery.UpdateCaption;
   begin
     Form1.Caption := 'Updated in a thread';
   end; }

{ TIBBackGroundQuery }

constructor TIBBackGroundQuery.Create(ADBName: String; ADBParams: TStrings;
                                     const ASQLString: String; const ADS: TDataSource);
begin
 inherited Create(false);

 FDBName    := ADBName;
 FDBParams  := TStringList.Create;
 FDBParams.Assign(ADBParams);
 FSQLString := ASQLString;

 FDS := ADS;
 FreeOnTerminate := false;
end;

destructor TIBBackGroundQuery.Destroy;
begin
 inherited;
 FIBDB.Free;
 FIBT.Free;
 FIBQSequences.Free;
end;

procedure TIBBackGroundQuery.ShowQryError;
begin
 Application.ShowException(FQueryException);
end;

procedure TIBBackGroundQuery.ConnectDataSource;
begin
 FDS.DataSet := FIBQSequences;
 FDS.DataSet.Active := true;
end;

procedure TIBBackGroundQuery.Execute;
begin
 { Place thread code here }
 try
 FIBDB:= TIBDataBase.Create(nil);
 FIBDB.LoginPrompt := false;
 FIBT := TIBTransaction.Create(nil);
 FIBDB.DatabaseName := FDBName;
 FIBDB.Params.Assign(FDBParams);
 FDBParams.Free;
 FIBT.Params.Clear;
 FIBT.Params.Add('read_committed');
 FIBT.Params.Add('rec_version');
 FIBT.Params.Add('nowait');
 FIBDB.DefaultTransaction := FIBT;
 FIBT.DefaultDatabase := FIBDB;
 FIBQSequences:= TIBQuery.Create(nil);
 FIBQSequences.Database := FIBDB;
 FIBQSequences.Transaction := FIBT;
 FIBQSequences.SQL.Clear;
 FIBQSequences.SQL.Add(FSQLString);

 FIBQSequences.Open;
 Synchronize(ConnectDataSource);
 except
   FQueryException := ExceptObject as Exception;
   Synchronize(ShowQryError);
 end;
end;

end.


Digitman   (2004-09-06 16:56:00) [25]


> galexis ©   (06.09.04 16:47) [29]


я-то ждал иного вопроса - "подскажите ссылку на инф-цию о принципах передачи параметров в методы Делфи-объектов" ... а в ответ - про сантехников и физиков .. печально это


>не основная работа и не хобби
> ..
> в отделе программного обеспечения в структуре власти


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


Анонимщик   (2004-09-06 16:55:00) [26]

Я же сказал, что почти, а не именно то. Тем более, что тебе для IB сессии не нужны вовсе. Делай отдельный подключения в каждом потоке.


galexis   (2004-09-06 16:54:00) [27]


> Анонимщик ©

Упс! А IBQuery не может работать с TSession :(


galexis   (2004-09-06 16:51:00) [28]


> Анонимщик ©   (06.09.04 16:46) [28]

О! Вот за это спасибо


galexis   (2004-09-06 16:47:00) [29]


> Digitman ©  

По поводу передавать в конструирующий методэто все поправимо, а вот начальником стать труднее. Я вот работаю в отделе программного обеспечения в структуре власти. По образованию физик. А два моих начальника (точнее начальник и его зам.) один, врач второй сантехник. А вы мне про ни то ни другое. Мне бы примерчик простенький, или ссылку на статейку по теме.


Анонимщик   (2004-09-06 16:46:00) [30]

Пардон,

http://www.delphiworld.narod.ru/base/background_db_queries.html


Анонимщик   (2004-09-06 16:36:00) [31]

Вот почти один-в-один то, что нужно:

http://www.instantchess.com/?EC=3&EXP=1&FindPl=%C2%EE%E2%EA&SUH=1&Date1=38229&RT2=1#4


Digitman   (2004-09-06 16:30:00) [32]


> Я вообще хочу начальником быть


не то, брат, не то ... настоящие начальники должны как минимум уметь писать "н ито н идругое", ну и опционально - уметь передавать в конструирующий метод произвольного класса (причем по барабану какого - TThread или TSomeClass) некие параметры


Reindeer Moss Eater   (2004-09-06 16:26:00) [33]

Мудрено в примерчике. Там используется конструктор.

Конструкторы везде используются где есть классы.
В том числе и в твоих программах написанных ранее.
Не только в том примерчике.


galexis   (2004-09-06 16:23:00) [34]


> Reindeer Moss Eater ©

Мудрено в примерчике. Там используется конструктор. Примерчик называется ThreadedQuery.
За программирование браться не стоит, если это не основная работа и не хобби. У меня как раз не то, не то. Я вообще хочу начальником быть :)


Reindeer Moss Eater   (2004-09-06 16:17:00) [35]

Передача параметров - мудрено?
Ну ну.

Стоит ли вообще браться за программирование?

...
with TMyThread.Create(MyDBGrid) do
resume;
...


galexis   (2004-09-06 16:12:00) [36]


> Digitman ©

Если бы я знал как это сделать? Есть правда в Demos от Delphi примерчик. Там как раз и передаются многие параметры. Опять же все как то мудрено там


Digitman   (2004-09-06 16:07:00) [37]


> На форме из которой был создан вторичный поток


почему бы форме, создавшей вторичный поток, не передать параметром в этот поток ссылку на себя ? и искать же ничего не нужно будет !


Reindeer Moss Eater   (2004-09-06 16:06:00) [38]

Как заполнить DBGrid данными из IBQuery вторичного потока?

DBGrid.DataSource:=MySource;
MySource.DataSet:=MyDataSet;


galexis   (2004-09-06 16:05:00) [39]


> Digitman ©

Да я и не спорю. Но и ясности у меня так и нет. Вот выполнился во вторичном потоке у меня запрос к БД. Теперь IBQuery содержит набор данных. На форме из которой был создан вторичный поток есть DBGrid. Как заполнить DBGrid данными из IBQuery вторичного потока?


Digitman   (2004-09-06 15:50:00) [40]


> galexis ©   (06.09.04 14:28) [5]


см. [13]

???


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо