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

Вниз

TADOConnection + Thread   Найти похожие ветки 

 
kblc ©   (2006-05-10 10:01) [0]

Уважаемые мастера, не могли бы вы помочь мне решить следующую проблему:

пишу только как пример:
Connection:=TADOConnection.Create;
...
thConnection:=Connection;

Запускаю поток CreateThread() в котором выполняю
...
thConnection.Open;
...
и отображаю анимашку в главное потоке (WaitingForSingleObject(hThread,...)) - мол подключается. Как только пользователь нажал Отмена(мол не хочет больше ждать) - нужно разорвать "недосоединение". Как это сделать?
Естественно, если я просто убиваю поток TerminateThread() - это не помогает.... Connection.Free - "подвисает"... и ничего не происходит.

Конечно - можно было бы создать ещё одно подключение и т.д. - но: 1) не спортивно это как-то, 2) после уничтожения всех форм висит моё приложение в ctrl+alt+del и ожидает чегото... наверное завершения этого подключения, хотя и Connection.Timeout:=1 не помогает - максимум я ждал минуты 3... на большее меня не хватило.


 
sniknik ©   (2006-05-10 11:50) [1]

свой поток убрать нафик, у конекта в ConnectOption поставить coAsyncConnect, при отмене вызывать Cancel.


 
kblc ©   (2006-05-10 12:03) [2]

как тогда определить результат попытки подключения?
т.е. "ПОДКЛЮЧИЛИСЬ" или "НЕ ПОДКЛЮЧИЛИСЬ. ОШИБКА: %s"?


 
Сергей М. ©   (2006-05-10 12:08) [3]

см. OnConnectComplete


 
kblc ©   (2006-05-10 14:23) [4]

Да, я воспользовался вашим советом, sniknik и Сергей М. . Но после того как я вызываю .Cancel - мне приходится ждать довольно большое время. С чем это может быть связано?


 
kblc ©   (2006-05-11 12:16) [5]

неужели никто не подскажет?


 
Сергей М. ©   (2006-05-11 12:46) [6]


> довольно большое время


> С чем это может быть связано?


Оно сопоставимо со временем при синхронном коннекте ?


 
sniknik ©   (2006-05-11 12:49) [7]

оно ждет таймаута, чтобы сообщить об ошибке (OnConnectComplete в любом случае будет)


 
kblc ©   (2006-05-11 13:21) [8]

т.е. в любом случае всё ограничивается timeout"ом?


 
kblc ©   (2006-05-11 14:51) [9]

2 Сергей М. : да
2 sniknik: т.е. в любом случае всё ограничивается timeout"ом?


 
Сергей М. ©   (2006-05-11 15:01) [10]


> kblc ©   (11.05.06 14:51) [9]


Тогда предложенный вариант с доп.потоком - не самый худший.


 
sniknik ©   (2006-05-11 15:55) [11]

> Тогда предложенный вариант с доп.потоком - не самый худший.
хуже, во первых ждать все одно придется, если коректно завершать, если некоректно "срубить" поток, то останется "мусор" в виде незавершонных COM обьектов.

и + [4] не совсем точно отражает происходящее, ждать не приходится если не делать завершений или д.р. действий закрывающих/уничтожающих ADOConnection, вот тут да ждеш, а так, программа продолжает работать.
(а типа не будет ожиданий при завершении потока при его занятости)


 
Сергей М. ©   (2006-05-11 15:59) [12]


> ждать все одно придется


Зато ждать при этом можно будет реагируя на GUI-события (MsgWaitForMultipleObjects)


 
sniknik ©   (2006-05-11 16:47) [13]

> Зато ждать при этом можно будет реагируя на GUI-события (MsgWaitForMultipleObjects)
нет. уйдет в "даун" на ADOConnection.Open, и пока из него не выйдет(вызов не завершится) никаких реагирований не получится.
до MsgWaitForMultipleObjects просто не дойдет.


 
Сергей М. ©   (2006-05-11 16:55) [14]


> до MsgWaitForMultipleObjects просто не дойдет.
>


Чтой-то вдруг ?

Стартуется доп.поток, в котором вся эта катавасия с коннектом осуществляется (хоть синхронно хоть асинхронно), после чего хэндл потока тут же передается параметром MsgWaitForMultipleObjects(), которая ждет завершение потока и реагирует на сообщения во время ожидания


 
sniknik ©   (2006-05-11 17:09) [15]

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

а если не видно разници(в поведении), то что лучше? имхо, то что проще.



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

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

Наверх




Память: 0.5 MB
Время: 0.044 c
3-1145378453
linx
2006-04-18 20:40
2006.06.18
"cannot attach to password database"


9-1130206311
JUS
2005-10-25 06:11
2006.06.18
Зацените мою демку


8-1137193431
rd
2006-01-14 02:03
2006.06.18
disparity map


6-1139502884
RusGl
2006-02-09 19:34
2006.06.18
Yahoo Messenger.


2-1148901797
delphi
2006-05-29 15:23
2006.06.18
Создание СОМ...