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

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

Запрос в потоке. Правильно пишу? [D7, XP]


Страницы:   1 2 3 4

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


Страницы:   1 2 3 4

Наверх

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