Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

Вопрос про окошко с прогресс баром.   Найти похожие ветки 

 
Тимохов   (2003-10-30 14:39) [0]

Наверное этот вопрос здесь неоднократно поднимался, но в факе пока ничего не нашел.

Есть долгоиграющий запрос. Нужно вывести сообщение "подождите пожалуйста...". При этом хочется сделать это в отдельном процессе. Т.к. если это делать в том же процессе, то нужно вызывать метод Application.ProcessMessages для того, чтобы окошко перерисовалось перед долгим запросом. Этот Application.ProcessMessages стал мне в последнее время мешать.
Нужно
1. Делать окно в отдельном процессе.
2. Этот процесс не должен выглядеть как отдельный процесс.

Кто нить делал так?


 
DVM   (2003-10-30 14:40) [1]

не процессе, а потоке наверное?


 
DVM   (2003-10-30 14:42) [2]

BeginThread(), CreateThread() ... одним словом F1


 
Тимохов   (2003-10-30 15:24) [3]

To DVM.
Насколько я понимаю VCL разрабатывалась как среда, где ей управляет только один процесс. Если нужен доступ к визуальным компонентам из разных потоков, то нужно пользоваться syncronize. Но и в этом случае если основоной поток занят работой, то никакой перерисовки не произойдет до тех пор пока основоной поток не завершит работу.

Конечно, правильнее запрос запихивать в отдельный поток. Но тогда возникает вопрос: для работы с БД нужен доступ к объекту AdoDb.Connection, который создан в основном потоке. Насколько я знаю по-умолчанию ado работает как apartment, а не как free. Вроде бы в этом случае работать с com объектом можно только их того потока, который объект создал.

На самом деле я пробовал работать с connection из другого потока, все работает. Но мне не очень понятно как это работает, т.к. это противоречит описанию threating model.
Привожу кусок из дельфового мануала
Apartment - COM ensures that only one client thread can call the object at a time. All client calls use the thread in which the object was created.

Не очень понятна фраза "All client calls use the thread in which the object was created". Имеется в виду, что это движок com делат так, что все вызовы методов будут из одного потока или это указание программерам, что вызовы надо делать из одного потока?

Одним словом вопрос: кто нить работал с адо из нескольких потоков?


 
Тимохов   (2003-10-30 15:24) [4]

Видноват, поправка:

"Насколько я понимаю VCL разрабатывалась как среда, где ей управляет только один ПОТОК."


 
ZeroDivide   (2003-10-30 15:57) [5]

offtopic:
Тимохов, где ты учился и чему?
"Насколько я понимаю VCL разрабатывалась как среда"
VCL - Библиотека визуальных компонентов, какая нахрен среда?

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

По делу:
All client calls use the thread in which the object was created -
Все клиентские вызовы используют поток в котором создан объект(их, клиентский) создан.


 
Anatoly Podgoretsky   (2003-10-30 15:59) [6]

TAnimate на форме и 0 кода


 
WithOut Any ...   (2003-10-30 16:07) [7]

Я обычно поступаю так же как и
Anatoly Podgoretsky © (30.10.03 15:59) [6]
TAnimate на форме и 0 кода


 
Тимохов   (2003-10-30 16:07) [8]

To ZeroDivide
-------------
Offtopic:
Наверное, немного некорректно говорить в таком тоне. Учился я на ВМК МГУ, года 3 назад закончил. Согласен: язык у меня иногда коряв.

Вопрос к секции "По делу":
Не мог бы ты подробнее объяснить фразу (тоже немного кривовата :))). Что значит "(их, клиентский)". Подругому сформулирую вопрос: допустимо ли использовать adodb.connection не в том потоку в котором он создан? И можно ли это делать без механизмов синхронизации?

То Anatoly Podgoretsky:
----------------------
Тоже не совсем подходит, т.к. еще хочется вывести там кнопку "отменить". Правда не очень мне понятно как из одного потока прервать запрос, выполняемый в другом потоке, к серверу MS SQL. Может знаете ответ на этот вопрос?


 
Anatoly Podgoretsky   (2003-10-30 16:28) [9]

Тимохов (30.10.03 16:07) [8]
Кнопка не проблема, но главное как отменить запрос на сервер, при том не обязательно MS SQL, при этом отменить корректно.


 
Тимохов   (2003-10-30 16:42) [10]

На самом деле, я действительно задал не тот вопрос, что меня интересовал: действительно, как отменить запрос?

Может кто знает???


 
ZeroDivide   (2003-10-30 16:47) [11]

Что значит "(их, клиентский)"
Тот поток в котором создан экземпляр класса (объект)

допустимо ли использовать adodb.connection не в том потоку в котором он создан?
Конечно допустимо.

И можно ли это делать без механизмов синхронизации?
Можно.

Правда не очень мне понятно как из одного потока прервать запрос, выполняемый в другом потоке, к серверу MS SQL.

Не знаю, никогда не убивал. Попробуй запрос вынести тоже в отдельный поток и убить поток и если All client calls use the thread in which the object was created значит, что и сессия связана с этим потоком, то при смерти потока она закроется и запрос соответственно отменится. Хм.. правда при этом может возникнуть провисшая транзакция: кто Rollback делать будет? Но это я думаю зависит от конкретной реализации SQL сервера. Oracle, например, транзакцию откатывает, как там у M$ не знаю.


 
Anatoly Podgoretsky   (2003-10-30 16:50) [12]

А кой какой сервер рухнет вместе с клиентом, жалобы в форуме были.


 
Тимохов   (2003-10-30 16:53) [13]

To ZeroDivide
-------------
Я то, в общем, так и делаю. Просто фраза "All client calls use the thread in which the object was created." мне была не совсем ясна. При том, что инглиш я знаю неплохо.

Т.е. еще раз (извини уж за повторение): мне заботится о том, чтобы adodb.connection вызывался из потока, в котором этот объект был создан, не надо - это будет сделано автоматически. Правильно?


 
WithOut Any ...   (2003-10-30 16:54) [14]

Тоже считаю, что лучше задавать вопросы, которые интересуют, а не ОКОЛО


 
Тимохов   (2003-10-30 16:57) [15]

To WithOut Any
--------------
Полностью согласен. Просто проблема вывода сообщения с кнопкой "отмена" во время долгих запросов к БД вообще похоже никем нормально в Delphi не решена. По крайне мере, несмотря на то, что у меня много знакомых, разрабатывающих клиентов для MS SQL, я не видет ни одного нормального решения.


 
WithOut Any ...   (2003-10-30 17:03) [16]

Ну а как на счет на счет Application.ProcessMessages.
Хотя детально не исследовал (по описанию вроде бы то).


 
Тимохов   (2003-10-30 17:05) [17]

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


 
Anatoly Podgoretsky   (2003-10-30 17:08) [18]

Тимохов (30.10.03 17:05) [17]
Вместо этого открой в Базах тему - как корректно отменить запрос?



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

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
1-41381
Denis
2003-10-30 11:53
2003.11.13
Виртуальные и динамические методы


1-41715
Тролль
2003-11-03 17:19
2003.11.13
Перенос пр-р и фуну-ий в другой файл


1-41360
esVer
2003-10-29 16:49
2003.11.13
Корректное освобождение памяти


7-42160
Fontom
2003-09-02 11:38
2003.11.13
COM порт (Таймауты)


14-42090
Denis
2003-10-23 13:25
2003.11.13
Как жить начинающему?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский