![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выполнение запроса с помощью TOracleQuery (DOA) в потоке. [D7]
Plt © (2004-07-01 16:47:00)Запускается приложение, конектюсь к базе. У TOracleSession свойство ThreadSafe = true. Передаю сессию в поток. Но пока не выполнится поток невозможно открыть новую форму!! В форму тоже передается сессия. Делаю так:
TSAMSesThread = class(TThread)
private
ExecQry: TOracleQuery;
HotSAM : string;
Ses : TOracleSession;
protected
procedure Execute; override;
procedure SaveAction;
public
procedure InitSAMSes(aSes : TOracleSession);
end;
procedure TSAMSesThread.InitSAMSes(aSes: TOracleSession);
begin
FreeOnTerminate := True;
Ses := aSes;
ExecQry := TOracleQuery.Create(nil);
ExecQry.Session := Ses;
with ExecQry do
begin
SQL.Clear;
SQL.Add('.....');
end;
Resume;
end;
procedure TSAMSesThread.Execute;
begin
try
ExecQry.Execute;
with ExecQry do
begin
while not Eof do
begin
HotSAM := HotSAM + Format('%s [¹%d Îïèñàíèå: %s]',[FieldAsString('sam'),FieldAsInteger('dev_id'),FieldAsString('dev_dsc')]) + ',';
Next;
end;
if RowCount > 0 then
Synchronize(SaveAction);
end;
finally
ExecQry.Free;
end;
end;
Plt (2004-07-01 17:10:00) [1]В новом варианте:
SAMSesThread := TSAMSesThread.Create(True);
SAMSesThread.InitSAMSes(ARM_Session); и все без Waitfor
procedure TSAMSesThread.InitSAMSes(aSes: TOracleSession; aLang: TJanLanguage);
begin
FreeOnTerminate := True;
Lang := aLang;
OraSes := TOracleSession.Create(nil);
OraSes.LogonUsername := aSes.LogonUsername;
OraSes.LogonPassword := aSes.LogonPassword;
OraSes.LogonDatabase := aSes.LogonDatabase;
OraSes.LogOn;
ExecQry := TOracleQuery.Create(nil);
ExecQry.Session := OraSes;
Reindeer Moss Eater (2004-07-01 17:06:00) [2]А еще не виден код основного потока, создающего нить.
Мало ли там чего может быть. Например waitfor
Reindeer Moss Eater (2004-07-01 17:02:00) [3]Создавать два TOracleSession мало.
Надо что бы запросы основного потока и вторичного использовали разные сессии
Plt (2004-07-01 16:59:00) [4]Пробывал создавать для каждого потока свой TOracleSession и убирал Synhronize, задержка осталась.
Reindeer Moss Eater (2004-07-01 16:50:00) [5]Видимо виноват Syncronize;
Либо у двух Query выполняющихся в разных потоках одна и та же сесия