![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача данных запроса к БД из потока [D6, IB6.x, FireBird]
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]
???