Форум: "Основная";
Текущий архив: 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