![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в потоке [D6, Win2k]
panov © (2004-09-16 20:27:00)При динамическом создании TADOConnection в методе потока TThtread.Execute возникает Exception, помогите найти ошибку?
uses
Classes,DB, ADODB, SyncObjs,windows,Sysutils;
type
TLongQuery = class(TThread)
private
FDB: TADOConnection;
Q: TADOQuery;
FWait: Boolean;
FQueryStr: String;
FError: Integer;
FEvent,FEventWaitComplete: TEvent;
CS: RTL_CRITICAL_SECTION;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
procedure ExecQuery(const aQueryStr: String;aWait: Boolean=True);
property LastError: Integer read FError;
end;
implementation
uses Proc;
destructor TLongQuery.Destroy;
begin
DeleteCriticalSection(CS);
FEvent.Free;
FEventWaitComplete.Free;
FEventWaitComplete := nil;
FEvent := nil;
if Assigned(Q) then Q.Free;
if Assigned(FDB) then FDB.Free;
end;
constructor TLongQuery.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
FError := 0;
FEvent := TEvent.Create(nil, True, False,'');
FEventWaitComplete := TEvent.Create(nil, True, False,'');
Resume;
end;
procedure TLongQuery.ExecQuery(const aQueryStr: String;aWait: Boolean=True);
begin
EnterCriticalSection(CS);
FQueryStr := Trim(aQueryStr);
FError := 0;
FWait := aWait;
FEvent.SetEvent;
if FWait then FEventWaitComplete.WaitFor(Infinite);
LeaveCriticalSection(CS);
end;
procedure TLongQuery.Execute;
var
s: String;
wr: TWaitResult;
begin
InitializeCriticalSection(CS);
EnterCriticalSection(CS);
try
FDB := TADOConnection.Create(nil);
FDB.Name := 'ADOC_';
s := GetParmStr('FDB','Provider');
if s='' then
begin
s := 'SQLOLEFDB.1';
WriteParmStr('FDB','Provider',s);
end;
FDB.Provider := s;
FDB.ConnectionString := 'Provider='+s+';';
s := GetParmStr('FDB','Persist Security Info');
if s='' then
begin
s := 'False';
WriteParmStr('FDB','Persist Security Info',s);
end;
FDB.ConnectionString := FDB.ConnectionString+'Persist Security Info='+s+';';
s := GetParmStr('FDB','User ID');
if s='' then
begin
s := 'wg';
WriteParmStr('FDB','User ID',s);
end;
FDB.ConnectionString := FDB.ConnectionString+'User ID='+s+';';
s := GetParmStr('FDB','Initial Catalog');
if s='' then
begin
s := 'wgFDB';
WriteParmStr('FDB','Initial Catalog',s);
end;
FDB.ConnectionString := FDB.ConnectionString+'Initial Catalog='+s+';';
s := GetParmStr('FDB','Data Source');
if s='' then
begin
s := 'SRVBASE';
WriteParmStr('FDB','Data Source',s);
end;
FDB.ConnectionString := FDB.ConnectionString+'Data Source='+s;
FDB.Open;
Q := TADOQuery.Create(nil);
Q.Connection := FDB;
except
FError := -1;
Terminate;
end;
LeaveCriticalSection(CS);
while not Terminated do
begin
wr := FEvent.WaitFor(1000);
if wr=wrTimeout then Continue;
Q.SQL.Text := FQueryStr;
try
// if UpperCase(Copy(FQueryStr,1,4))='SELE'
// then Q.Open
// else Q.ExecSQL;
Q.ExecSQL;
except
FError := -2;
end;
if FWait then FEventWaitComplete.SetEvent;
FEvent.ResetEvent;
end;
{ Place thread code here }
end;
Ошибка возникает на выделенной жирным шрифтом строке.
panov (2004-09-16 20:54:00) [1]>jack128 © (16.09.04 20:48) [5]
Да нет, тоже был в Execute-(
jack128 (2004-09-16 20:48:00) [2]panov © (16.09.04 20:44) [4]
Снова добавил вызов CoInitialize, Ошибка пропала
может раньше он вызов) стоял в constructor TLongQuery.Create; ..
panov (2004-09-16 20:44:00) [3]>jack128 © (16.09.04 20:38) [3]
Честно говоря, я в недоумении...
Снова добавил вызов CoInitialize, Ошибка пропала.
Заодно еще нашел ошибки - уже в данных.
Спасибо за помощь, все-таки форум сильно иногда помогает-)
jack128 (2004-09-16 20:38:00) [4]jack128 © (16.09.04 20:33) [1]
Не помешал бы класс и тект ошибки,
panov (2004-09-16 20:36:00) [5]CoInitialize выполнял при попытках найти ошибку, то же самое происходит.
jack128 (2004-09-16 20:33:00) [6]Не помешал бы класс и тект ошибки, но наверника нужно инициализировать СОM
procedure TLongQuery.Executeж
begin
CoInitialize;
try
// Твой код
finally
CoUninitialize;
end;
end;