Форум: "Базы";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизADOConnection=3 потока? Найти похожие ветки
← →
Bless © (2005-09-23 09:27) [0]В новом приложении на пустую форму кидаю ADOCOnnection и соединяюсь с базой MSSQL. (connected=true). Запускаюсь и вижу что в приложении project1 живут 4 потока.
Кто-то может сказать, почему их так много? Что они делают?
← →
Курдль © (2005-09-23 09:31) [1]Думаю, что поддерживают сетевые протоколы, а что? Мешают?
← →
Bless © (2005-09-23 10:08) [2]Курдль © (23.09.05 09:31) [1]
Думаю, что поддерживают сетевые протоколы, а что? Мешают?
Смущают. А что значит "поддерживают сетевые протоколы"?
← →
Курдль © (2005-09-23 10:11) [3]
> Смущают. А что значит "поддерживают сетевые протоколы"?
>
Если программа должна поддерживать взаимосвязь с другой программой, и при этом действия юзера не должны приостанавливаться до завершения какой-либо операции, то логично предположить, что эта взаимосвязь будет организована с помощью отдельных потоков (асинхронная связь).
← →
Nikolay M. © (2005-09-23 10:38) [4]
> Курдль © (23.09.05 09:31) [1]
> Думаю, что поддерживают сетевые протоколы
Опять фигню какую-то болтаешь. Лишь бы ляпнуть, а что - неважно?
> Кто-то может сказать, почему их так много? Что они делают?
Создаются при создании АДО-объектов для выполнения асинхронных запросов (для ADOConnection - асинхронного соединения при ConnectOptions = coAsyncConnect). Можешь в этом убедиться, не бросая на форму ни один компонент из закладки АДО и написав в OnButtonClick что-то вродеvar
c : TADOConnection;
begin
c := TADOConnection.Create (self);
c.Free;
end;
оттрейсить эти 2 строчки и параллельно посмотреть на кол-во потоков в Task manager.
← →
Bless © (2005-09-23 11:24) [5]
> Курдль © (23.09.05 10:11) [3]
>
>
> > Смущают. А что значит "поддерживают сетевые протоколы"?
>
> >
>
>
> Если программа должна поддерживать взаимосвязь с другой
> программой, и при этом действия юзера не должны приостанавливаться
> до завершения какой-либо операции, то логично предположить,
> что эта взаимосвязь будет организована с помощью отдельных
> потоков (асинхронная связь).
Только это, имхо, называется не поддерживать сетевые протоколы, а поддерживать соединение, что две большие разницы.
>Nikolay M. [4]
> Создаются при создании АДО-объектов для выполнения асинхронных
> запросов (для ADOConnection - асинхронного соединения при
> ConnectOptions = coAsyncConnect).
ConnectOptions стоит по-умолчанию coConnectUnspecified. Проверил : во время выполнения он таким и остается. И тем не менее - 4 потока.
Кроме того, почему именно 3 дополнительных? Почему не 10, не 1? Это где-то выставляется?
> Можешь в этом убедиться, не бросая на форму ни один компонент
> из закладки АДО и написав в OnButtonClick что-то вроде
>
> var
> c : TADOConnection;
> begin
> c := TADOConnection.Create (self);
> c.Free;
> end;
Это немножко не так.
Будет только один поток (проверил).
Их будет 4, если между Create и Free вставитьc.connectionString :=...
c.connected := true;
То есть, дополнительные потоки появляются не после создания, а после соединения с базой. А именно после вызова метода ConnectionObject.Open
Наверное количество потоков или определяется где-то в недрах ADO либо сервером.
Только непонятно нафига 3?. Что нельзя создавать их по мере необходимости?
Или они все 3 нужны с самого начала? Тогда что они делают?
← →
Nikolay M. © (2005-09-23 11:36) [6]
> ConnectOptions стоит по-умолчанию coConnectUnspecified.
> Проверил : во время выполнения он таким и остается. И тем
> не менее - 4 потока.
Неважно, какие установлены опции, потоки создаются при создании АДО-объекта.
> Это немножко не так.
> Будет только один поток (проверил).
Не устанавливая соединения, непосредственно до момента выполнения Free у программы будет 3 потока.
← →
Bless © (2005-09-23 12:07) [7]Nikolay M. © (23.09.05 11:36) [6]
Не устанавливая соединения, непосредственно до момента выполнения Free у программы будет 3 потока.
Гм... Проверял?
У меня 1 поток, если не устанавливать соединение.
Делал даже так (в OnClick кнопки)var
c : TADOConnection;
begin
c := TADOConnection.Create (self);
end;
Все-равно один поток.
← →
Nikolay M. © (2005-09-23 13:27) [8]Free напиши. В твоем случае с высвободится сразу, как неиспользуемая далее в коде переменная.
← →
Bless © (2005-09-23 15:20) [9]Nikolay M.[8]>
Да писал я Free. И ставил точку останова. Один поток.
И так делал:
c := TADOConnection.Create (self);
showmessage(c.connectionString);
с.free;
и смотрел количество потоков, пока висело окошко - один поток!
В твоем случае с высвободится сразу, как неиспользуемая далее в коде переменная.
Вот уж сильно сомневаюсь. Чтоб позволить себе такие вольности, у Делфи недостаточно информации. c вполне могло бы быть не ADOConnection-ом,
а, к примеру, TForm и тогда с этим объектом вполне можно было бы дальше работать, хотя сама переменная потерялась при выходе из обработчика. В этом случае подобная самодеятельность Делфи (освобождение памяти) могла бы закончиться крахом приложения.
Кроме того где-то внутри ADOConnection в конструкторе могли теоретически создаваться какие-то списки в куче (о который Делфи не в курсе дела), которые освобождаются в деструкторе и простое освобождение памяти, выделенной под объект, привело бы к утечке памяти.
Короче говоря, я почти уверен, что в таких случаях делфи память не освобождает. Разве только память под саму переменную (4 байта), не не память, выделенную под экземпляр класса.
← →
Nikolay M. © (2005-09-23 15:48) [10]
> Да писал я Free. И ставил точку останова. Один поток.
У меня 3.
> c вполне могло бы быть не ADOConnection-ом,
> а, к примеру, TForm и тогда с этим объектом вполне можно
> было бы дальше работать, хотя сама переменная потерялась
> при выходе из обработчика.
Имхо, ты путаешь локальные и глобальные переменные.
← →
Bless © (2005-09-23 16:57) [11]Nikolay M. © (23.09.05 15:48) [10]
У меня 3.
Гм... Странно. А какая версия ADO?
У меня 2.7
Имхо, ты путаешь локальные и глобальные переменные.
Что именно я путаю?
По отношению к объектам нет никакой разницы, имхо, созданы они внутри процедуры или вне любых процедур (в отличие от с++).
Проверь сам.procedure TForm1.Button1Click(Sender: TObject);
var
f: TForm1;
begin
f := TForm1.create(nil);
f.show;
end;
В результате на экране будет несколько одинаковых форм.
Или, может, я неправильно истолковал твое замечание?
← →
Nikolay M. © (2005-09-23 18:39) [12]
> Гм... Странно. А какая версия ADO?
> У меня 2.7
Смотря как ты ее получаешь. У меня
ADOConnection.Version = 2.7.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess\Version = 2.71.9040.2
Component checker-а майкрософтовского под рукой нет, качать лень :(
Дельфи 6.
> может, я неправильно истолковал твое замечание?
Нет, это я не дочитал до
> Короче говоря, я почти уверен, что в таких случаях делфи
> память не освобождает. Разве только память под саму переменную
> (4 байта), не не память, выделенную под экземпляр класса.
← →
Nikolay M. © (2005-09-24 13:45) [13]Попробовал сейчас дома. ADOConnection.Version = 2.7.
Создание-уничтожение TADOTable не меняет кол-во потоков. TADOConnection - создается 1 дополнительный поток (пул коннектов?).
← →
DiamondShark © (2005-09-24 13:58) [14]
> А какая версия ADO?
А дело не в версии, а в провайдере.
Один провайдер может вообще никаких потоков не создавать, а другой -- много чего ещё создавать.
Вы при сравнении ещё указывайте, какими провайдерами пользуетесь, и с какими параметрами.
← →
Nikolay M. © (2005-09-24 21:20) [15]
> Вы при сравнении ещё указывайте, какими провайдерами пользуетесь,
> и с какими параметрами.
А мы тут совсем идиоты... Какой в [4] может быть провайдер?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.048 c