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;


han_malign   (2010-12-07 12:57:00) [1]


> CoInitialize ?

- CoInitialize Ex(nil,COINIT_MULTITHREADED)

> Ибо методы его в тихую будут вызваны в создавшем его потоке.....

- все чуть запутанней: http://www.compdoc.ru/prog/cpp/com/ch5/ch52.shtml


Ega23   (2010-12-07 07:25:00) [2]


> Ибо методы его в тихую будут вызваны в создавшем его потоке.
> ....

Это уже интересно. Ща обдумаем.


Вариант   (2010-12-07 06:58:00) [3]


> Ega23 ©   (06.12.10 19:58) [74]


> CoInitialize ?

Кстати тема интересная. Я не уверен в своем правильном понимании этой темы. Поэтому разовью, а кто хорошо знает пусть поправит. Создав COM объект в потоке имеющий апартамент STA (в дельфи основной поток по умолчанию) мы вызывая методы объекта объекта даже в другом потоке, все равно переадресуем вызов этих методов (маршалируем) в поток создавший этот объект. То есть имеем ситуацию
> han_malign   (06.12.10 18:21) [73]
И Coinitialize в другом потоке (создаем апартамент STA для вызвавшего потока) не поможет, если COM объект был создан в другом. Ибо методы его в тихую будут вызваны в создавшем его потоке.....


Ega23   (2010-12-06 19:58:00) [4]


> то доп. поток не поможет - один фиг все будет маршалироваться
> в контекст основного потока...


CoInitialize ?


han_malign   (2010-12-06 18:21:00) [5]


> (TXXXQuery) должен быть создан в основном потоке, а выполняться во вторичном

- если это OLE провайдер, и интерфейс создается в STA(по умолчанию, см. comobj), то доп. поток не поможет - один фиг все будет маршалироваться в контекст основного потока... Другое дело, что большинство провайдеров и так асинхронные и вынос явного ожидания завершения запроса в другой поток - это просто чесание левого уха правой пяткой...


Ega23   (2010-12-06 16:59:00) [6]


>  Крит.секция = объект синхронизации ?


А что это, по-твоему?


> И причем здесь вообще синхронизация - я про нее хоть заикнулся?


Дык и я о том же, синхронизация не нужна, однако "крит.секция нужна, ясен пень". Может таки RTFM пора?


> Не даем себе труд хотя бы элементарно въехать в смысл того,
>  что говорят


Искренне пытаюсь уже несколько дней это сделать. Почему создавать кверь я долженв основном потоке, почему я должениспользовать одно соединение, а также нафига нужнакрит.секция в вышестоящем примере - я так и не понял.


> На здоровье, но без меня.

Понятно. Т.е. слив засчитан, да?


MsGuns   (2010-12-06 16:51:00) [7]

>Ega23 ©   (06.12.10 11:08) [69]
>У тебя каша в голове. Читай внимательно MSDN по CreateThread

Разберись сначала со своей

>Один тред - один коннект. Иначе грабли, рано или поздно.

А вот это чушь полная

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

Я ж говорю, мухи и котлеты. Крит.секция = объект синхронизации ?
И причем здесь вообще синхронизация - я про нее хоть заикнулся ?

>Да если бы это в потрепаловке было, или там в базах - я бы давно слюной >плюнул на дремучесть, да и дело с концом.

Не даем себе труд хотя бы элементарно въехать в смысл того, что говорят, зато продолжаем хамить ?  На здоровье, но без меня.


Ega23   (2010-12-06 11:28:00) [8]


> ЗЫ. Похоже, ты, Олежа, просто уперся и не хочешь отступать.
>  Поэтому спор дальнейший бессмысленен.


Да если бы это в потрепаловке было, или там в базах - я бы давно слюной плюнул на дремучесть, да и дело с концом. ССЗБ, можешь писать как вздумается.
Но в начинающих хрень постить - это некузяво.


Ega23   (2010-12-06 11:08:00) [9]


> Т.е. если кверик был создан в нити, то нить и должна его
> прибить погибая.


У тебя каша в голове. Читай внимательно MSDN по CreateThread
Если ты мне там хоть один класс покажешь - я прилюдно буду извиняться.


> Кроме того, зачем грузить в нить всякую требуху для того
> кверика. Например, параметры соединения, текст запроса и
> прочие разности, о которых "знает" логика осн.программы,
>  но вовсе не обязан знать поток, основная функция которого
> в данном случае - всего лишь распараллеливание.


Один тред - один коннект. Иначе грабли, рано или поздно.


> Для того же, для чего нужны критические секции для любого
> кода, в котором могут быть независимые от программы ошибки.
>  Например, при выделении ресурсов системой. Опять же делаю
> как завещали умные люди :)


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


MsGuns   (2010-12-06 02:02:00) [10]

>Ega23 ©   (05.12.10 17:24) [66]
>Объясни мне, что мешает создать кверь в дополнительном треде, >выполнить, передать на неё указатель основному треду, после чего убить >дополнительный тред?

Видишь ли, я приучен к тому, что каждый созданный объект должен помирая, уничтожить все, что он создал для своей работы. Т.е. если кверик был создан в нити, то нить и должна его прибить погибая. Поэтому в осн.поток указатель-то я передать могу, но только на что он будет указывать ? Или же нить "поручит" убийство потоку основному ? А вот такие программы я в корзине видел, а программистов, пишущих такое - в гробу в белых тапках,
Кроме того, зачем грузить в нить всякую требуху для того кверика. Например, параметры соединения, текст запроса и прочие разности, о которых "знает" логика осн.программы, но вовсе не обязан знать поток, основная функция которого в данном случае - всего лишь распараллеливание.

>> Для его создания критическая секция нужна, ясен красень.
>Зачем она нужна??? Да ещё и на создание? Для чего????

Для того же, для чего нужны критические секции для любого кода, в котором могут быть независимые от программы ошибки. Например, при выделении ресурсов системой. Опять же делаю как завещали умные люди :)

ЗЫ. Похоже, ты, Олежа, просто уперся и не хочешь отступать. Поэтому спор дальнейший бессмысленен. На что я и намекал в [61] ;)


Юрий Зотов   (2010-12-05 22:36:00) [11]

Are binary programmers deathless?...
:o)


Ega23   (2010-12-05 17:24:00) [12]


>  Если квери создать в самом потоке, то по завершении запроса
> нужно либо куда-то в осн.поток эти данные передать (скопировать),
>  либо не убивать поток до тех пор, пока данные запроса не
> станут ненужными.


Дааааа?
Объясни мне, что мешает создать кверь в дополнительном треде, выполнить, передать на неё указатель основному треду, после чего убить дополнительный тред?


> Для его создания критическая секция нужна, ясен красень.


Зачем она нужна??? Да ещё и на создание? Для чего????


Ega23   (2010-12-05 17:19:00) [13]


> Создавать его, конечно, можно где угодно, но логично поручить
> это главному потоку.


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

Собственно, я и доковырялся до должен. Ибо он может быть создан где угодно.


MsGuns   (2010-12-05 15:21:00) [14]

>Ega23 ©   (03.12.10 11:33) [62]
>Серёж, мы же не первый год на форуме. Да и не нубы, вроде как.

Не нубы, но иногда хамим :)

>И "за базар" отвечать должны тоже не так, как нубы.
>Почему "TxxxQuery надо создавать в главном потоке"

Я писал там, что если данные, полученные квери, нужны для отображения. Т.е. поток уже не нужен (он выполнился, "скачав" данные с сервера на клиент, более он не нужен, поэтому логично его прибить). Если квери создать в самом потоке, то по завершении запроса нужно либо куда-то в осн.поток эти данные передать (скопировать), либо не убивать поток до тех пор, пока данные запроса не станут ненужными. Короче - геморрой да и только.
Много проще создать и подготовить запрос  и готовый передать (точнее указатель на него - это чтоб ты меня опять в чем-нить не начал обвинять :) потоку. Он выполнить запрос, "отследив" результат, и благополучно помрет.

>и почему "крит.секция нужна только на момент создания объекта".

Опять-таки речь шла о кверике. Для его создания критическая секция нужна, ясен красень. А вот выполнение его в асинхронном режиме в трай и нафиг ну нужно засовывать (Хотя бы потому, что само АДО эти самые траи всунет куда надо), а просто "ловить" состояние запроса в цикле и, получив сигнал о завершении (ошибочном или нормальном), обработать его или передать гл.потоку.

Я давал этот "совет" (кстати, снабдив его имхой, т.е. не навязывал и не считал единственно верным) потому, что сам так делал многократно и все надежно фунциклировало: юзер весело шарился мышой или клацал клавой, а выборка (выборки) спокойно себе шла в фоне, о чем гденить в статусстроке светался соотв.текстик :)


Юрий Зотов   (2010-12-04 23:20:00) [15]

> Ega23 ©   (03.12.10 11:33) [62]

> Почему "TxxxQuery надо создавать в главном потоке"

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


Ega23   (2010-12-03 11:33:00) [16]


> Если тебе нравится считать, что я не разбираюсь, то на здоровье


Серёж, мы же не первый год на форуме. Да и не нубы, вроде как. И "за базар" отвечать должны тоже не так, как нубы.
Так что давай, аргументируй. Почему "TxxxQuery надо создавать в главном потоке" и почему "крит.секция нужна только на момент создания объекта".
Как говорится, TITS or GTFO


MsGuns   (2010-12-02 19:50:00) [17]

>Ega23 ©   (02.12.10 19:21) [60]

Мухи и котлеты :)
Если тебе нравится считать, что я не разбираюсь, то на здоровье :)


Ega23   (2010-12-02 19:21:00) [18]


> Аргументы, как всегда, убойные.


Вы хочите песен?
Их есть у меня

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


Кто сказал, что "сам TXXXQuery должен быть создан" ...
Что вообще такое класс TThread, тебе известно? Как запустить код на исполнение в отдельном треде без данного класса? Кто там, где и когда помирает?
Есть мнение, что ты не очень разбираешься в этой кухне, ничего личного.

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

Критические секции нужны для исключения одновременного доступа с изменением к данным.
Если у тебя доступ - строго чтение, то пофигу. Тебя же не напрягает использование одной и той же константы из разных тредов? А вот если я читаю данные, а кто-то начал их модифицировать, тогда можетслучиться "ой". А может и нет, это как повезёт.

З.Ы. рекомендую внимательно посмотреть на код TThread.


MsGuns   (2010-12-02 18:46:00) [19]

>Ega23 ©   (02.12.10 11:55) [57]
>Вот только всё равно в [32] пункты 4 и 5 - чушь. :)

>Игорь Шевченко ©   (02.12.10 16:32) [58]
>"Вы, сударь, ерунду говорите. И хуже всего то, что говорите >безапеляционно и уверенно"

Аргументы, как всегда, убойные.
Уполз в кусты помирать :)


Игорь Шевченко   (2010-12-02 16:32:00) [20]


> Имелось в виду, что одну и ту же работу бухгалтер (экономист,
>  технолог, менеджер по продажам и т.д.) делает с "многопоточной"
> программой в два-три раза быстрее, чем с программой, работающей
> "как обычно".
> Проверено многократно.


"Вы, сударь, ерунду говорите. И хуже всего то, что говорите безапеляционно и уверенно"


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

Наверх

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