Главная страница
    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.46 MB
Время: 0.013 c
14-96963
kostya2000
2003-01-12 20:33
2003.01.30
Ветки!


14-97005
Maximator Vetera
2003-01-12 20:52
2003.01.30
Песня


9-96507
Сирожа
2002-08-07 00:08
2003.01.30
DirectX


1-96680
Filat
2003-01-20 12:27
2003.01.30
ListView и ProgressBar, как совместить?


1-96689
jirua
2003-01-21 21:39
2003.01.30
Обьявление процедуры





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