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

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

Коннект к базе в дополнительном потоке


Страницы:   1 2

Piter ©   (2005-08-29 23:50:00) 

Вот думаю - как правильно реализовать соединение с базой в отдельном потоке.

Допустим, есть класс от TThread... Но как им управлять?
Хочется реализовать так, чтобы ему можно было дать любое SQL выражение, он его выполнит. Ну если с INSERT, UPDATE понятно... То что делать с SELECT? Как поток вернет набор данных?


Alexander Panov   (2005-08-30 13:38:00) [21]

Val ©   (30.08.05 13:30) [8]
Что SQL сервер знает о клиентских потоках?


А ему оно надо?


Val   (2005-08-30 13:30:00) [22]

...однако аргументов по этому поводу не предоставляли...
Аргумент стандартен: Что SQL сервер знает о клиентских потоках?


Piter   (2005-08-30 13:22:00) [23]

То есть, нормального способа прервать длительную операцию нет?

Блин... неправильно это как-то... нелогично. Неужели не предусмотрели...


Alexander Panov   (2005-08-30 08:52:00) [24]

Piter ©   (30.08.05 1:42) [4]
Free для доп. потока теюе не поможет, как и Database.Close.
Только TerminateThread.


Карелин Артем   (2005-08-30 06:03:00) [25]

Если очень надо - уничтожай поток. Некоторые товарищи писали что это неправильно, однако аргументов по этому поводу не предоставляли. :)


Piter   (2005-08-30 01:42:00) [26]

Ну вот допустим такой вопрос...

Связь с базой данных медленная - плохой канал связи там или например операция с базой выполняется длительное время.

Соответственно какой-нибудь оператор Query.ExecSQL может повесить приложение на несколько минут, интерфейс недоступен - нехорошо.

Выход - работать с базой в потоке, ок.
Но возникает вопрос - а как "нормально" прервать данный процесс? Например, если приложение надо срочно закрыть?

Если сделали Query.ExeSQL и идет работа - думаю, некорректно будет из другого потока делать Query.Free? А что же тогда делать? Какая-то безвыходная ситуация...

Или вот способо прервать - это сделать TDatabase.Connect := false... но опять же - когда идет работа - разве корректно будет из другого потока делать Database.Connect := false?


Reindeer Moss Eater   (2005-08-30 00:35:00) [27]

Вообще TDataSet является threadsafe классом.
Надо лишь визуальные контролы подключать к нему после открытия.


Alexander Panov   (2005-08-30 00:30:00) [28]

Piter ©   (29.08.05 23:50)

Схематично:

TQueryComplete=procedure(Query: TQuery) of object;

TQueryThread=class(Tthread)
private
  FDB: TDatabase;
  FQuery: TQuery;
  FStr: String;
  FOnComplete: TQueryComplete;
protected
  procedure Execute; override;
public
  procedure ExecQuery(const Query: String);
  property OnComplete: TQueryComplete read FOnComplete write FOnComplete;
end;

procedure TQueryThread.Execute;
begin
  FDB := TDatabase.CReate(nil);
  ...
  FQuery := TQuery.CReate;
  ...
  Suspend;
  while not Terminated do
  begin
    try
       FQuery.Close;
       FQUery.Sql.Text := FStr;
       if UpperCase(Copy(FStr,1,6))='SELECT'
         then FQuery.Open
         else FQuery.ExecSql;
    except
    end;
    if Assigned(FOnComplete) then FOnComplete(FQuery);
    Suspend;
  end;
end;

procedure TQueryThread.ExecQuery(const Query: String);
begin
  FStr := Query;
  Resume;
end;


Примерно так можно.


Reindeer Moss Eater   (2005-08-30 00:18:00) [29]

Вернет.
А куда он денется с подводной-то лодки?


Страницы:   1 2

Наверх

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