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;


12   (2010-12-01 10:37:00) [41]

Все, не тормозит вообще
> 1. Передать в тред ConnectionString
> 2. Передать в тред текст запроса
> 3. Создать соединение с БД, создать DataSet
> 4. Выполнить, дождаться конца
> 5. Отсигналить в основной тред, что данные зафетчены
> 6. передать сам НД через мессадж
И убиваю поток, когда пользователь новый запрос просит выполнить


> Красиво, но нахрен не нужно.

а боюсь, что так и получится
Но так, чисто для себя, чтоб на душе было комфортно :)


Ega23   (2010-12-01 09:58:00) [42]


> Пункт 1 не чушь.


Возможно. Я про асинхронный режим на память не силён, надо справку читать.


Anatoly Podgoretsky   (2010-12-01 09:29:00) [43]

> Ega23  (01.12.2010 00:55:34)  [34]

Пункт 1 не чушь. Скажи что делать если запущен очень длительный запрос и его
надо прекратить нормально, а не аварийно?


Ega23   (2010-12-01 00:55:00) [44]


> MsGuns ©   (30.11.10 20:30) [32]


Пункты 4 и 5 - чушь.
Также сильно подозреваю, что 1 и 2 - тоже. Под рукой справки нет.


Игорь Шевченко   (2010-11-30 23:14:00) [45]

по сабжу - делал когда-то по дури заполнение грида отдельным потоком, типа данные бегают себе асинхронно, граждане довольные расходятся по домам и все такое.

Красиво, но нахрен не нужно.


MsGuns   (2010-11-30 20:30:00) [46]

1. Не имеет смысла запускать в потоке то, чем нет возможности управлять. Например, запрос, который нельзя прервать. А если пресловутый "кверик" можно "снять" (не знаю как в уракле, а в АДО есть т.н. асинхронный режим, позволяющий не ждать завершения выполнения запроса)

2. Если запрос управляем, то где код, реализующий проверку на Terminate потока и соответственно "снимающий" кверик ?

3. На время выполнения "фоновых" запросов никоим образом не связывать их с визуальными компонентами - только по завершению.

4. Если результаты "фонового" запроса должны отображаться, то сам запрос (TXXXQuery) должен быть создан в основном потоке, а выполняться во вторичном, куда собственно и следует передавать указатель на квери при создании и запуске потока. Это позволит потоку благополучно помереть после завершения, а результатам - остаться для дальнейшего использования

5. Критические секции нужны лишь на создание объектов, но никак ни на сам ход выполнения запроса - для этого всего лишь нужно получать и обрабатывать сообщения сервера в "обычном", некритичном коде. Что легко делвется в "управляемом" запросе.

Все ИМХО


Игорь Шевченко   (2010-11-30 18:22:00) [47]


> Программирование - то? :)


не, дваркование запроса в отдельном потоке влэндишым способом.


> А все норовите обидеть да задеть.


А теперь подумай - а нафиг мне это ?


engine   (2010-11-30 18:07:00) [48]

Вот еще интересный вариант:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1355

Интересно, что о нем думают мастера?


Ega23   (2010-11-30 17:53:00) [49]

Но мне эта схема всё равно не нравится. Используй TClientDataSet, что-ли...


Ega23   (2010-11-30 17:49:00) [50]


> Но, тут в потоке. Придет ссылка - а поток разрушен, вдруг?
>
> Надо гарантировать, что не разрушится


Блин. Ты свой Query в потоке создал, но не разрушил. Разрушать будет главный поток.
Дальше, из потока ты сделал SendMessage. В параметре передал ссылку на созданный Query. Пока обработчик SendMessage не отработает - поток будет ждать. Соответственно, там ссылку из параметра сохранил и сделал все телодвижения.
Поток дождался и убился. При этом деструктор Query не вызывает.


Engine   (2010-11-30 17:47:00) [51]

Может тогда не использовать FreeOnTerminate :=true? Разрушать только тогда, когда уж точно не нужен больше.


12   (2010-11-30 17:40:00) [52]


> SendMessage главному окну, LParam = Integer(Query)
> соответственно, в главном окне Query = TOraQuery(Pointer(LParam))

Это понятно, это давно использую
Но, тут в потоке. Придет ссылка - а поток разрушен, вдруг?
Надо гарантировать, что не разрушится
Ща, еще порисую..
Спасибо, Олег.

Просто первый раз серьезно решил заняться. На уровне сдать лабу - сдавал, но не пригодилось никогда еще :)

Кстати,
2 ИШ


> нафиг тебе это ?

Программирование - то? :)
Да как сказать..

Вот Вы большой и умный и Мастер даже..
А все норовите обидеть да задеть. Мне то пофиг, меня так обижали - ой-ёй

И получается, что просто Вас читать даже не хочется - ну чего нового Вы расскажете - ничего. Только сделаете очередную попытку оскорбить

А от Мастера ожидается как-бы посыл хоть и на 3 буквы (я про www, не подумайте :)) но чтоб мысли родились в голове.
от посыла то, от этого, от мастерского :)

Ну вот как-то так.


Ega23   (2010-11-30 17:23:00) [53]

Про Owner e Qwery не забывай. Либо разрушай самостоятельно.
Хотя стрёмный это путь. Не нравится чем-то. Чем - не могу сказать.


> передавать пользователю только хотелось бы изящно


SendMessage главному окну, LParam = Integer(Query)

соответственно, в главном окне Query = TOraQuery(Pointer(LParam))


12   (2010-11-30 17:17:00) [54]

ща, поробую
и сам уже на листке порисовал-порисовал   -  надо, наверное, в потоке кверик создать
передавать пользователю только хотелось бы изящно - ссылку на область, которую будет трактовать как надо


engine   (2010-11-30 17:00:00) [55]

Согласен, изначально реализация была кривой. Хорошо, что у меня объекты, с которыми работает поток, создаются внутри потока.
Спасибо, за подробное объяснение.


Ega23   (2010-11-30 16:53:00) [56]


> как сделает? Он же через property к FQ обращается, а там
> защищено


Да щаз.


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;


В проперть-то его кто положил? Оно от сырости там завелось?

самый простой пример:
1. я создал экземпляр TOraQuery (в основном треде). Назовём Q1: TOraQuery.
2. я создал экземпляр ThQuery (в основном треде). Назовём Th1: ThQuery
3. я присвоил Th1.Q := Q1;
4. Отправил Th1.Resume
5. Th1 выполняется полчаса, например
6. через минуту я взял и вызвал Q1.Free.

Заметь, не Th1.Q.Free, а именно Q1.Free


engine   (2010-11-30 16:46:00) [57]

как сделает? Он же через property к FQ обращается, а там защищено


Ega23   (2010-11-30 16:44:00) [58]


> engine ©   (30.11.10 16:38) [14]
>
> а если так:


А что это даст? Это будет означать, что данный тред встал в крит-секцию и выполняет FQ.Open
при этом, если ссылка на этот FQ есть у кого-то другого, ничего не мешает этому "другому" сделать FQ.Free.
Ибо этот "другой" ничего про твою крит-секцию не знает и слюной на неё плевать хотел.


engine   (2010-11-30 16:43:00) [59]

тогда [14] должно быть правильно


Ega23   (2010-11-30 16:41:00) [60]


> Или бессмысленно, т.к. работаем с ссылкой на объект, а не
> с самим объектом?


Тут дело в другом. Нужно чтобы и стой стороны, ну, со стороны основного треда, доступ к FQ тоже через эту же крит-секцию был организован.


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

Наверх

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