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

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

Выполнение запроса с помощью 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 выполняющихся в разных потоках одна и та же сесия


Наверх

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