Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TADOConnection + Thread [Win95/98, Win2k, WinXP]


kblc ©   (2006-05-10 10:01:00) 

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

пишу только как пример:
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-11 17:09:00) [1]

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

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


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


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


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

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


sniknik   (2006-05-11 16:47:00) [3]

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


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


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


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


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

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

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


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


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


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


kblc   (2006-05-11 14:51:00) [7]

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


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

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


sniknik   (2006-05-11 12:49:00) [9]

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


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


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


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


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


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

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


kblc   (2006-05-10 14:23:00) [12]

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


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

см. OnConnectComplete


kblc   (2006-05-10 12:03:00) [14]

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


sniknik   (2006-05-10 11:50:00) [15]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо