Текущий архив: 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