![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отмена DataSet.Open в потоке [D7, MSSQL]
Санёк © (2004-11-05 12:44:00)Создаю поток в котором
procedure TDBThread.Execute;
DataSet := TADODataSet.Create(nil);
DataSet.ConnectionString := ConnectionString;
DataSet.CommandText := CommandText;
try
DataSet.Open;
except
end;
end;
потом прибиваю его
TerminateThread(DBThread.Handle, 0);
DBThread.DataSet.Free;
DBThread := nil;
всё работает и так как именно хотелось. Но, есть проблема, память не освобождается. При запуске нового потока программа только увеличивается в размере. Как освободить память?
Fay (2004-11-09 16:58:00) [1]2 sniknik © (09.11.04 15:48) [15]
Вас не затруднит отправить и мне то же самое? Plz.
sniknik (2004-11-09 15:48:00) [2]выслал. ты бы почту сразу указывал и в положенном месте, как все нормальные люди. а то еще искать нужно, да копировать а не тычком мыши... мрак в общем. обычно на такое не отвечают.
Санёк (2004-11-09 11:25:00) [3]А можно всё же примерчик получить???
KSergey (2004-11-06 13:39:00) [4]Не на, повторно не надо ;)
Я имел в виду сразу в форум - ну да ладно. Спасибо.
sniknik (2004-11-06 12:18:00) [5]> А мне, мне... ;)
так тебе и высылал... не дошло? мыло s_wr@mail.ru нерабочее?
> Может сюда?
куда сюда? кладовка не работает. и потом до вторника все откладывается в любом случае, с работы слал, пример хоть и простенький но набивать повторно желания нет.
KSergey (2004-11-06 10:26:00) [6]> sniknik © (05.11.04 17:39) [9]
> никаких "ждите", не нужно. посмотри почту.
А мне, мне... ;)
Может сюда?
Санёк (2004-11-05 17:47:00) [7]А мне можно посмотреть???? Tualan@yandex.ru
sniknik (2004-11-05 17:39:00) [8]никаких "ждите", не нужно. посмотри почту.
KSergey (2004-11-05 16:59:00) [9]Возможно не Close, а cancel или что-то такое
А вообще точно помню недавно тут было подобное, автора тоже направили по пути асинхронных запросов, правда ему все хотелось мнгновенной реакции, но она не получается. Сам что-то тоже экспериментировал на волне обсуждения, но в упор не помню.
Наверное просто прибивать тред не стоит. Достаточно по нажании кнопки пользователем сделать вид что все прервано. Ну а там уж попытаться завершить внутри потока всю эту галиматью (а то и вовсе без потока - при асинхронном-то режиме).
Ну а если ему еще и прогу приспичило закрыть - ну тогда либо "ждите отмены", либо прибить - тут уже все равно в принципе.
Санёк (2004-11-05 15:35:00) [10]Удалено модератором
Примечание: дубль
Санёк (2004-11-05 15:35:00) [11]Удалено модератором
Примечание: дубль
Санёк (2004-11-05 15:34:00) [12]"Не удается выполнить операцию во время ассинхронного выполнения" это при закрытии приложения после Close. И выполнив Close программа всё равно продолжает жрать память... Что с этим делать???
sniknik (2004-11-05 14:46:00) [13]не врет, просто неправильно считает ;о), вернее считает не то чего юзеры ожидают, ожидают только память программы а оно дает всю пямять задействованную прогой и используемыми модулями (dll/com обьектами/...)
а только память программы в виндах это нечто мифическое. ;о))
> Как же можно прервать открытие набора данных????
элементарно, close, только открываться он должен в асинхронном режиме, иначе не будет доступа к методу до полного завершения открытия.
KSergey (2004-11-05 13:57:00) [14]> [2] Санёк (05.11.04 12:57)
> Память мерял "Диспетчер задач Windows":),
Миллионы раз писалось тут - врет он!
Санёк (2004-11-05 12:57:00) [15]Память мерял "Диспетчер задач Windows":), неужели никак нельзя??? Как же можно прервать открытие набора данных????
KSergey (2004-11-05 12:49:00) [16]Чем память мерял?
Да и создать объект в одном потоке, уничтожить в другом... Впрочем, межет и не страшно, коль скоро того потока уже и нет...
Вот только TerminateThread в любом случае будет приводить к утечкам - ведь создается не только экземпляр DataSet, но и DBThread как минимум. Хотя его, наверное, можно уничтожить (в смысле дельфийский объект), а вот связаннве с ним системные ресурсы... только по закрытию проги...