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

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

создание adoconnection и adoquery в потоке [D6, access]


denis24 ©   (2004-12-09 11:04:00) 

Помогите пожалуста.Возникла необходимость создавать в потоке сабж и делать запрос
Пишу

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');

И тут виснет.Что я делаю не так?


sniknik   (2004-12-13 18:48:00) [1]

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

> Конекта автоматического тут вообще нет.
см. [6]
если конект не задавать самому (создавать) а прописать в компоненте строку конекта то он создается автоматически, а ему... см. выше.

> Переписал создание потока и модальной формы.
формы, это форма была? VCL-ная? и потом потоковому событию присваиваеш? не "зреадсейфе" компонент?
еще один глюк (который в принципе не там но должен проявиться)

совет. выкини все. создай простой простой (пустой) поток, и после когда заработает, добавляй по одному два оператора...


denis24   (2004-12-13 12:40:00) [2]

да парные они стоят,ты думаеш я такой идиот?
Конекта автоматического тут вообще нет.В последнем примере создал только 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-11 00:07:00) [3]

> никто не подскажет?
а толку? тебе говорили вызовы парные должны быть инициализация/разынициализация, и...?

> [6]
конект автоматический,  LoginPrompt:=false; ему не поставиш а без этого виснет тоже (форма логина автоматически VCL-ая вызывается...).

> Working_ReportFinished
откуда ???

> finally
>        free;
> end;
одно? а создавал пару обьектов, и к чему оно отнесется? хорошо если не к потоку но я бы не рисковал.

(а уж сколько глюков за многоточиями скрывается... не передать ;о))


denis24   (2004-12-10 17:41:00) [4]

никто не подскажет?


denis24   (2004-12-10 13:01:00) [5]

Ничего не понимаю.
Щас вообще ничего не передаю в поток

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;


sniknik   (2004-12-09 15:31:00) [6]

не, скорее изза того, что тепер ты целый датасет извне теперь затаскиваеш...
AdoQueryArchiv:=TDataSet.Create(nil); //создали, зашибись пока правильно
AdoQueryArchiv:=AdoQueryArchiv_main;  //переписали созданое внешним  датасетом  
(теперь у нас есть один потерянный и два указателя на одни и те же методы/данные датасета к которым обращатся будеш из разных потоков)
сомневаюсь что это будет работать.


denis24   (2004-12-09 12:37:00) [7]

Вызываю конструктор
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 11:55:00) [8]

> Adoconnection.ConnectionString:=DataModule2.ADOConnection1.ConnectionString;
вот это сделай как нибудь по другому, всетаки из другого модуля/потока строку тянеш.
(переопредели конструктор к примеру и передавай строку при создании потока ххх:= TWorking_report_word.Create(DataModule2.ADOConnection1.ConnectionString)? внутри сохраняеш и после используеш (проще чем дополнительно процедуру передачи делать и вызывать ее в сонхронизации)

и главное CoInitialize строго парами вызывают, если инициализировал значит и разынициализировать обязан (см. хелп по нему)


denis24   (2004-12-09 11:37:00) [9]

Переписал

.
.
.
CoInitialize(nil);
Adoconnection:=TADOConnection.Create(nil);
Adoconnection.ConnectionString:=DataModule2.ADOConnection1.ConnectionString;
Adoconnection.LoginPrompt:=false;
Adoconnection.CursorLocation:=clUseServer;
Adoconnection.Connected:=true;

И после этого виснет


clickmaker   (2004-12-09 11:25:00) [10]

CoInitialize в начале потока вызываешь?


Наверх

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