Главная страница
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.51 MB
Время: 0.022 c
3-41043
Tumcoat
2003-10-14 08:52
2003.11.13
Физическое удаление записей


6-41872
Человек
2003-09-08 21:53
2003.11.13
Proxy


6-41854
famous
2003-09-10 03:33
2003.11.13
поиск в web документе


1-41458
MixerPro
2003-10-29 11:14
2003.11.13
Как передавать переменные программе при запуске?


8-41752
ianus
2003-06-18 18:51
2003.11.13
Tmediaplayer