Главная страница
    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.01 c
4-1142926924
MaxxSoft
2006-03-21 10:42
2006.06.18
Создание невидимого окна


4-1143009161
Purgen
2006-03-22 09:32
2006.06.18
Размер окна?


15-1148586287
GEN++
2006-05-25 23:44
2006.06.18
Нужен бесплатный компонент


5-1133720702
775
2005-12-04 21:25
2006.06.18
отображать занятость номеров в гостиннице.


15-1148561342
Petr V. Abramov
2006-05-25 16:49
2006.06.18
не запускается BDE-приложение





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