Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.039 c
6-1121929019
Profik
2005-07-21 10:56
2005.11.06
WinMessenger


1-1129098274
Антоныч
2005-10-12 10:24
2005.11.06
Перестала работать функция дополнения класса


2-1128867307
quadronik
2005-10-09 18:15
2005.11.06
Сортировка записей через SQL-запрос


9-1119397693
!Trinix
2005-06-22 03:48
2005.11.06
Работа в закрытых помещениях.


2-1129301080
Qand
2005-10-14 18:44
2005.11.06
Как в PageControl сделать невидимой одну из страниц?





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