Текущий архив: 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.46 MB
Время: 0.007 c