Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

Опять про потоки...   Найти похожие ветки 

 
nikulin ©   (2003-01-22 09:46) [0]

Есть класс потока.
Создаю поток так:

procedure TForm1.Button1Click(Sender: TObject);
begin
Test := TTest.Create(False);
end;

Наблюдаю следующее.
Сразу после старта проги в Task Manager"е в столбце потоки количество потоков 1. Когда поток завершает работу количество потоков остается равным 2. Вроде все удаляю. Откуда берется еще один поток?

**********************************************************
unit Unit2;

interface

uses
Classes, ADODB, Windows;

const
ConnectString = "Provider=SQLOLEDB.1;" +
"Integrated Security=SSPI;" +
"Persist Security Info=False;" +
"Initial Catalog=Abonent;Data Source=cops";

type
TTest = class(TThread)
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
private
{ Private declarations }
FADOCn: TADOConnection;
FADODataSet: TADODataSet;
protected
procedure Execute; override;
end;

implementation

constructor TTest.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
Priority := tpNormal;
FreeOnTerminate := True;

FADOCn := TADOConnection.Create(nil);
FADOCn.ConnectionString := ConnectString;
FADOCn.Open;

FADODataSet := TADODataSet.Create(nil);
end;

destructor TTest.Destroy;
begin
FADOCn.Close;
FADOCn.Free;

FADODataSet.Free;
end;


procedure TTest.Execute;
begin
FADOCn.Execute("select null");
MessageBox(0,"","",0);
end;

end.


 
Digitman ©   (2003-01-22 09:59) [1]

type
TTest = class(TThread)
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
private
{ Private declarations }
FADOCn: TADOConnection;
FADODataSet: TADODataSet;
procedure DoMsgBox; // !!!

protected
procedure Execute; override;
end;
....

constructor TTest.Create(CreateSuspended: Boolean);
begin
inherited Create(True); // !!!
Priority := tpNormal;
FreeOnTerminate := True;

FADOCn := TADOConnection.Create(nil);
FADOCn.ConnectionString := ConnectString;
FADOCn.Open;

FADODataSet := TADODataSet.Create(nil);
if CreateSuspended then // !!!
Resume; // !!!
end;

procedure TTest.DoMsgBox;
begin
MessageBox(0,"","",0); // !!!
end;

procedure TTest.Execute;
begin
try // !!!!!
FADOCn.Execute("select null");
// MessageBox(0,"","",0); // ????
Synchronize(DoMsgBox); // !!!!!
except // !!!!
// no exceptions must be raised/re-raised here !!!
end;
end;



 
nikulin ©   (2003-01-22 10:04) [2]

Так это же не изменило ситуации. Так же два потока осталось.


 
Digitman ©   (2003-01-22 10:16) [3]

Так ты возьми и проконтролируй, что за потоки работают !
На то каждый поток обладает уникальным ThreadId


procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToHex(GetCurrentThreadId, 8)); // Id осн.код.потока процесса

Test := TTest.Create(True);
ShowMessage(IntToHex(Test.ThreadId, 8)); // Id доп.код.потока процесса
Test.Resume;
end;

запусти приложение автономно (без отладки под Делфи)

теперь сравни полученные Id"ы с "показаниями" диспетчера задач.

Id осн.потока совпадет с одним из двух Id в диспетчере.

Если Id другого потока в диспетчере будет отличаться от Test.ThreadId, то, вероятно, это один из код.потоков, неявно стартованных ADO-механизмом. Почему он не завершается - этио уже другой вопрос.


 
Smithson ©   (2003-01-22 10:40) [4]

Стоял я на этих граблях. Похоже, второй поток используется VCL для Synchronize


 
nikulin ©   (2003-01-22 10:51) [5]

Попробовал я создавать объект TADOConnection просто так вне потока. После его освобождения остается один поток. Вот так.


 
Digitman ©   (2003-01-22 11:16) [6]

Каждый поток, осуществляющий доступ к OLE/COM-механизму в режиме котроллера, ОБЯЗАН выполнять обращения к этому механизму вот в таких в "скобках" :

CoInitialize(nil);
try
... работа с OLE/COM
finally
CoUnitialize(nil);
end;

Эти "скобки" неявно присутствуют в коде осн.потока, но в доп.потоке это нужно делать явно.

ADO-механизм базируется на OLE/COM-механизме, так что использование в доп.потоке как компонента ADOConnection, так и методов/св-в любых компонентов, зависящих от ADOConnection, должно сопровождаться этими "скобками", открывающими и закрывающими метод Execute()


 
nikulin ©   (2003-01-22 13:21) [7]

Спасибо Digitman
Попробую так.



Страницы: 1 вся ветка

Текущий архив: 2003.01.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
3-96570
dash78
2003-01-13 08:32
2003.01.30
Работа с Excel


3-96625
Imshanya
2003-01-13 12:39
2003.01.30
Перспективы формата БД PARADOX


1-96776
Mikle
2003-01-22 20:43
2003.01.30
Параметрический запуск приложения


1-96699
Юра
2003-01-20 13:00
2003.01.30
Адрес обработчика


1-96738
Masik
2003-01-22 10:39
2003.01.30
Компиляция пакаджа...