Форум: "Базы";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Внизсоздание adoconnection и adoquery в потоке Найти похожие ветки
← →
denis24 (2004-12-09 11:04) [0]Помогите пожалуста.Возникла необходимость создавать в потоке сабж и делать запрос
Пишу
type
TWorking_report_word = class(TThread)
AdoQuery2:TADOQuery;
Adoconnection:Tadoconnection;
procedure TWorking_report_word.Execute;
.
.
.
Adoconnection:=TADOConnection.Create(nil);
Adoconnection.ConnectionString:=DataModule2.ADOConnection1.ConnectionString;
Adoconnection.LoginPrompt:=false;
AdoQuery2:=TADOQuery.Create(nil);
AdoQuery2.Connection:=Adoconnection;
.
.
.
with AdoQuery2 do
begin
sql.Clear;
sql.add("select * from tbl1 where id=1");
И тут виснет.Что я делаю не так?
← →
clickmaker © (2004-12-09 11:25) [1]CoInitialize в начале потока вызываешь?
← →
denis24 (2004-12-09 11:37) [2]Переписал
.
.
.
CoInitialize(nil);
Adoconnection:=TADOConnection.Create(nil);
Adoconnection.ConnectionString:=DataModule2.ADOConnection1.ConnectionString;
Adoconnection.LoginPrompt:=false;
Adoconnection.CursorLocation:=clUseServer;
Adoconnection.Connected:=true;
И после этого виснет
← →
sniknik © (2004-12-09 11:55) [3]> Adoconnection.ConnectionString:=DataModule2.ADOConnection1.ConnectionString;
вот это сделай как нибудь по другому, всетаки из другого модуля/потока строку тянеш.
(переопредели конструктор к примеру и передавай строку при создании потока ххх:= TWorking_report_word.Create(DataModule2.ADOConnection1.ConnectionString)? внутри сохраняеш и после используеш (проще чем дополнительно процедуру передачи делать и вызывать ее в сонхронизации)
и главное CoInitialize строго парами вызывают, если инициализировал значит и разынициализировать обязан (см. хелп по нему)
← →
denis24 (2004-12-09 12:37) [4]Вызываю конструктор
TWorking_report_word.Create1(true, DataModule2.ADOQueryArchiv,DataModule2.ADOConnection1.ConnectionString)
В конструкторе передаю переменной этот connectionstring,
constructor
TWorking_report_word.Create1(createsuspend:boolean;AdoQueryArchiv_main:Tdataset;path_db1:string);
begin
inherited Create(True);
AdoQueryArchiv:=TDataSet.Create(nil);
AdoQueryArchiv:=AdoQueryArchiv_main;
path_db:=path_db1;
end;
затем connectionstring нового adoconnection=переменой
ADOConnection.ConnectionString:=path_db;
Пробую
Adoconnection.Connected:=true;
Переменная точно правильная.
Может из-за того что в datamodule.adoconnection1 открыт?
← →
sniknik © (2004-12-09 15:31) [5]не, скорее изза того, что тепер ты целый датасет извне теперь затаскиваеш...
AdoQueryArchiv:=TDataSet.Create(nil); //создали, зашибись пока правильно
AdoQueryArchiv:=AdoQueryArchiv_main; //переписали созданое внешним датасетом
(теперь у нас есть один потерянный и два указателя на одни и те же методы/данные датасета к которым обращатся будеш из разных потоков)
сомневаюсь что это будет работать.
← →
denis24 (2004-12-10 13:01) [6]Ничего не понимаю.
Щас вообще ничего не передаю в поток
type
TWorking_report_word = class(TThread)
AdoQuery2:TADOQuery;
.
.
.
procedure TWorking_report_word.Execute;
.
.
begin
try
CoInitialize(nil);
AdoQuery2:=TADOQuery.Create(nil);
AdoQuery2.ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\eva\eva1.mdb";
with AdoQuery2 do
begin
sql.Clear;
sql.add("select * from tbl1 where id=1"// и тут виснет
end;
.
.
.
Вызываю поток с главной формы так
with TWorking_report_word.Create(true),TfrmWorking_report.Create(nil) do
try
FreeOnTerminate:=true;
OnTerminate:=Working_ReportFinished ;
resume;
ShowModal;
finally
free;
end;
← →
denis24 (2004-12-10 17:41) [7]никто не подскажет?
← →
sniknik © (2004-12-11 00:07) [8]> никто не подскажет?
а толку? тебе говорили вызовы парные должны быть инициализация/разынициализация, и...?
> [6]
конект автоматический, LoginPrompt:=false; ему не поставиш а без этого виснет тоже (форма логина автоматически VCL-ая вызывается...).
> Working_ReportFinished
откуда ???
> finally
> free;
> end;
одно? а создавал пару обьектов, и к чему оно отнесется? хорошо если не к потоку но я бы не рисковал.
(а уж сколько глюков за многоточиями скрывается... не передать ;о))
← →
denis24 (2004-12-13 12:40) [9]да парные они стоят,ты думаеш я такой идиот?
Конекта автоматического тут вообще нет.В последнем примере создал только adoquery и пишу в него запрос.
По поводу Working_ReportFinished
procedure Tfrmworking_report.Working_ReportFinished(sender:tobject);
begin
modalresult:=mrOk;
end;
Закрывается модальная форма при окончании потока.
Переписал создание потока и модальной формы.
frmWorking_report:=TfrmWorking_report.Create(self);
MyThread2:=TWorking_report_word.Create(true);
try
MyThread2.FreeOnTerminate:=true;
MyThread2.OnTerminate:=frmWorking_report.Working_ReportFinished ;
MyThread2.resume;
frmWorking_report.ShowModal;
finally
MyThread2.free;
frmWorking_report.Free;
end;
Результат тотже.Виснет при попытке присвоить значение adoquery.sql.text:=".....
← →
sniknik © (2004-12-13 18:48) [10]> да парные они стоят,ты думаеш я такой идиот?
а кто ж тебя знает? ты же не показываеш и не говориш что это зделал, а по обрывкам ... , на третье замечание только среагировал и сказал что сделал а до этого упорно один показывал и догадывайся что в непоказаном нормально.
> Конекта автоматического тут вообще нет.
см. [6]
если конект не задавать самому (создавать) а прописать в компоненте строку конекта то он создается автоматически, а ему... см. выше.
> Переписал создание потока и модальной формы.
формы, это форма была? VCL-ная? и потом потоковому событию присваиваеш? не "зреадсейфе" компонент?
еще один глюк (который в принципе не там но должен проявиться)
совет. выкини все. создай простой простой (пустой) поток, и после когда заработает, добавляй по одному два оператора...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c