Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Вниз

Запрос в потоке. Правильно пишу?   Найти похожие ветки 

 
Ega23 ©   (2010-12-01 10:51) [40]


> И убиваю поток, когда пользователь новый запрос просит выполнить


Зачем? Ставь его в Suspend. Соединение создано, НД создан.


 
12 ©   (2010-12-01 11:02) [41]


> Screen.Cursor := crSQLWait;
> try
>  DataSet.Open;
> finally
>  Screen.Cursor := crDefault;
> ebd;

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


 
Ega23 ©   (2010-12-01 11:04) [42]

А, ну это другое дело.


 
12 ©   (2010-12-01 11:05) [43]


> ачем? Ставь его в Suspend. Соединение создано, НД создан.

Логично, ща..


 
Ega23 ©   (2010-12-01 11:19) [44]

На самом деле я бы пул соединений сделал. Т.е. есть класс потока, есть класс - список этих потоков. У класса-списка есть свойство, типа MaxConnections. Также этот класс-список знает, какие потоки у него в данный момент раюотают, а какие - простаивают.
Передал туда текст запроса, он пробежался по списку. если нашёл свободный - передал запрос ему. Если свободных не нашёл - создал новый (если Count < MaxConnections). Если свободных нет и Count = MaxConnections - ждём, пока кто-то освободится.


 
12 ©   (2010-12-01 11:23) [45]


> Ega23 ©   (01.12.10 11:19) [44]

Больно сурьезно
если будет надобность - надо будет попробавать нечто подобное сделать


 
Игорь Шевченко ©   (2010-12-01 11:26) [46]


> но тогда пользователь в другое МДИ окно не мог переключится
> и поредактировать что-то, пока запрос идет.


Вот это и есть САМОЕ ГЛАВНОЕ ЗАБЛУЖДЕНИЕ.

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


 
Ega23 ©   (2010-12-01 11:27) [47]


> Больно сурьезно


В целом именно так и делается. Таким образом можешь самостоятельно нагрузкой на БД рулить.


 
Ega23 ©   (2010-12-01 11:28) [48]


> Вот это и есть САМОЕ ГЛАВНОЕ ЗАБЛУЖДЕНИЕ.


ИМХО, +1.
Юзер скорее на "Косынку" какую-нибудь переключится.


 
Anatoly Podgoretsky ©   (2010-12-01 13:34) [49]


> 12 ©   (01.12.10 10:40) [38]

Анимация


 
Anatoly Podgoretsky ©   (2010-12-01 13:35) [50]

> 12  (01.12.2010 10:40:38)  [38]

Ассинхронные запросы. Но надо уметь с ними работать. Ассинхронность, веэде,
не всем подвластна.


 
Anatoly Podgoretsky ©   (2010-12-01 13:37) [51]


> Юзер скорее на "Косынку" какую-нибудь переключится.

Боятся. Предпочитают подождать.


 
MsGuns ©   (2010-12-01 20:46) [52]

>Ega23 ©   (01.12.10 11:28) [48]
>Юзер скорее на "Косынку" какую-нибудь переключится.

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

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


 
Leonid Troyanovsky ©   (2010-12-01 22:42) [53]


> MsGuns ©   (01.12.10 20:46) [52]

>  а многопоточность весьма уместна и реально в разы повышает
> эффективность работы с прогой.

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

--
Regards, LVT.


 
Ega23 ©   (2010-12-01 23:42) [54]


>  берем любую профи-прогу (тот же почтовый клиент, торрент
> и многое другое) и смотрим как реализовано, в т.ч. интерфейс
> - и делаем так же


Открыл m-Torrent и Thunderbird. Посмотрел на интерфейс. MDI не увидел.
Что я делаю не так?


 
MsGuns ©   (2010-12-02 11:22) [55]

А кто говорил про МДИ ?


 
MsGuns ©   (2010-12-02 11:25) [56]

>Leonid Troyanovsky ©   (01.12.10 22:42) [53]
>Повышение эффективности многопоточности можно связать,
>например, с ростом количества процессоров в системе, хотя,
>уж вовсе не в разы.

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


 
Ega23 ©   (2010-12-02 11:55) [57]


> А кто говорил про МДИ ?


Влад говорил.


> Проверено многократно.


С этим никто не спорит. "Всякому овощу...", как ИШ любит говорить.
Вот только всё равно в [32] пункты 4 и 5 - чушь. :)


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


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


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


 
MsGuns ©   (2010-12-02 18:46) [59]

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

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

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


 
Ega23 ©   (2010-12-02 19:21) [60]


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


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

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


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

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

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

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


 
MsGuns ©   (2010-12-02 19:50) [61]

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

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


 
Ega23 ©   (2010-12-03 11:33) [62]


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


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


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

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

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

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


 
MsGuns ©   (2010-12-05 15:21) [64]

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

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

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

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

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

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

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


 
Ega23 ©   (2010-12-05 17:19) [65]


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


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

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


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


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


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


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


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


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

Are binary programmers deathless?...
:o)


 
MsGuns ©   (2010-12-06 02:02) [68]

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

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

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

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

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


 
Ega23 ©   (2010-12-06 11:08) [69]


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


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


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


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


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


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


 
Ega23 ©   (2010-12-06 11:28) [70]


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


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


 
MsGuns ©   (2010-12-06 16:51) [71]

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

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

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

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

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

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

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

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


 
Ega23 ©   (2010-12-06 16:59) [72]


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


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


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


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


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


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


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

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


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


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

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


 
Ega23 ©   (2010-12-06 19:58) [74]


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


CoInitialize ?


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


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


> CoInitialize ?

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


 
Ega23 ©   (2010-12-07 07:25) [76]


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

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


 
han_malign   (2010-12-07 12:57) [77]


> CoInitialize ?

- CoInitializeEx(nil,COINIT_MULTITHREADED)

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

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.005 c
15-1290258354
Константинов
2010-11-20 16:05
2011.02.27
Внешний USB диск не видит ПК что делать?


15-1289987238
Scott Storch
2010-11-17 12:47
2011.02.27
Жесткий баг XE


15-1289927971
Пит
2010-11-16 20:19
2011.02.27
Изменение FormStyle в кострукторе формы


2-1291296114
privet123
2010-12-02 16:21
2011.02.27
Способ прочитать с диска - правильно так?


15-1289990564
alexdn_
2010-11-17 13:42
2011.02.27
Майкрософт, конференция, платформа 2011





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский