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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.013 c
15-1148654663
Palladin
2006-05-26 18:44
2006.06.18
По поводу овертайма в хоккее


15-1148274904
Александр Иванов
2006-05-22 09:15
2006.06.18
Сумма прописью


2-1149245176
DelphiLexx
2006-06-02 14:46
2006.06.18
ComboBox отловить нажатие на стрелочку


15-1148396545
Andy BitOff
2006-05-23 19:02
2006.06.18
... заповеди пролетариата.


1-1147212202
Германн
2006-05-10 02:03
2006.06.18
TListView





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