![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Коннект к базе в дополнительном потоке
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]Вернет.
А куда он денется с подводной-то лодки?