Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

создание 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
1-1104034380
Viktop
2004-12-26 07:13
2005.01.16
По какому рисунку был сделан клик?


1-1104516664
Cheguevara
2004-12-31 21:11
2005.01.16
Как создать компоненту в координатах клика мыши?


1-1104284473
Wood
2004-12-29 04:41
2005.01.16
Пока выполняется процесс.


10-1080657973
Timego
2004-03-30 18:46
2005.01.16
Delphi & COM: How to Do Singleton Com-server?


4-1101395871
Kair
2004-11-25 18:17
2005.01.16