![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос в потоке. Правильно пишу? [D7, XP]
12 © (2010-11-30 15:48:00)
TQ: ThQuery;
после прочтения Многопоточность - как это делается в Дельфи
решил применить к жизни.
Пишу
...
TQ := ThQuery.Create(True);
TQ.FreeOnTerminate := True;
TQ.Q := AQuery;
TQ.Resume;
....
где,
type
ThQuery = class(TThread)
private
FQ: TOraQuery;
function GetQ: TOraQuery;
procedure SetQ(const Value: TOraQuery);
protected
procedure Execute; override;
public
property Q: TOraQuery read GetQ write SetQ;
end;
implementation
procedure ThQuery.Execute;
begin
Q.Open;
end;
function ThQuery.GetQ: TOraQuery;
begin
Result := FQ;
end;
procedure ThQuery.SetQ(const Value: TOraQuery);
begin
FQ := Value;
end;
Юрий Зотов (2010-11-30 16:41:00) [61]
> engine © (30.11.10 16:39) [16]
В Delphi (и не только) любой объект - это ссылка.
engine (2010-11-30 16:39:00) [62]Или бессмысленно, т.к. работаем с ссылкой на объект, а не с самим объектом?
Юрий Зотов (2010-11-30 16:39:00) [63]
> Ega23 © (30.11.10 16:22) [8]
Только то, что во время выполнения длительного запроса у юзера не возникнет ощущения, что программа зависла.
engine (2010-11-30 16:38:00) [64]а если так:
EnterCriticalSection(CS)
try
FQ.Open;
finally
LeaveCriticalSection(CS);
end;
engine (2010-11-30 16:36:00) [65]
> Но никак не защитит на момент выполнения самого треда.
>
Точно, каюсь, был невнимателен. А за ремарку спасибо, об этом я не знал. Пошел править.
Ega23 (2010-11-30 16:36:00) [66]Тут подумал. Вообще не защитит. Ни от чего. Вообще бессмысленно.
Ega23 (2010-11-30 16:30:00) [67]
> на сколько я понимаю, то в данном случае это защитит от
> одновременного обращения к полю FQ из основного и доп.потока,
> или я не прав? Поправьте тогда, самому интересна эта тема.
Да. Защитит. На момент операции присваивания. Но никак не защитит на момент выполнения самого треда.
Ну и в качестве ремарки: если есть EnterCriticalSection, то Leave - исключительно через try..finally. Иначе впоследствии намучаешься DeadLock-и ловить.
Ega23 (2010-11-30 16:27:00) [68]По-хорошему, надо делать как-то так:
1. Передать в тред ConnectionString
2. Передать в тред текст запроса
3. Создать соединение с БД, создать DataSet
4. Выполнить, дождаться конца
5. Отсигналить в основной тред, что данные зафетчены
6. Перегнать данные в основной тред (ну или передать сам НД, хотя я бы не стал)
7. Убиться.
При многих тредах имеет смысл организовать пул соединений. Хотя это от архитектуры зависит.
engine (2010-11-30 16:27:00) [69]на сколько я понимаю, то в данном случае это защитит от одновременного обращения к полю FQ из основного и доп.потока, или я не прав? Поправьте тогда, самому интересна эта тема.
Ega23 (2010-11-30 16:22:00) [70]
> хотя бы так, надо:
И чего это даст???
Игорь Шевченко (2010-11-30 16:20:00) [71]
> TQ: ThQuery;
> после прочтения Многопоточность - как это делается в Дельфи
> решил применить к жизни.
> Пишу
нафиг тебе это ?
engine (2010-11-30 16:01:00) [72]хотя бы так, надо:
type
ThQuery = class(TThread)
private
FQ: TOraQuery;
CS: TCriticalSection;
function GetQ: TOraQuery;
procedure SetQ(const Value: TOraQuery);
protected
procedure Execute; override;
public
property Q: TOraQuery read GetQ write SetQ;
end;
implementation
procedure ThQuery.Execute;
begin
Q.Open;
end;
function ThQuery.GetQ: TOraQuery;
begin
EnterCriticalSection(CS);
Result := FQ;
LeaveCriticalsSection(CS);
end;
procedure ThQuery.SetQ(const Value: TOraQuery);
begin
EnterCriticalSection(CS);
FQ := Value;
LeaveCriticalsSection(CS);
end;
ну и добавить InitializeCriticalSection/DeleteCriticalSection;
12 (2010-11-30 15:59:00) [73]
> Ega23 © (30.11.10 15:54) [3]
не, наверное не так выразился.
По-идее, должно быть так: Нажал выполнить запрос - а форму в это время можно таскать, ресазить, она должна отвечать, словом.
Не отвечает все равно, с пол-секунды где-то
12 (2010-11-30 15:57:00) [74]да?
что-то не уверен,
класс потока переписал так, остальное оставил
type
ThQuery = class(TThread)
protected
procedure Execute; override;
public
Q: TOraQuery;
end;
implementation
procedure ThQuery.Execute;
begin
Q.Open;
end
Ega23 (2010-11-30 15:54:00) [75]А теперь навесь на данный экземпляр TOraQuery несколько обработчиков, прицепи DataSource и DBGrid.
И посмотри на результат.
Engine (2010-11-30 15:53:00) [76]Неправильно, нет синхронизации между Q и FQ
12 (2010-11-30 15:52:00) [77]к чему - что-то не вижу разницы, притормаживает все равно.
Тесты на пару миллионах записях, fetchall = true