![]() |
|
|
|
|
#1
|
|||
|
|||
|
Здравствуйте! Не хотел писать в своем топе про службы, т.к. вопрос немного другой.
Есть поток, у которого есть процедура OnTerminate, если создать такой поток в простом приложении, то нормально отрабатывает execute, потом OnTerminate, и поток прекращает жить. Но если этот же поток создается в службе, то execute отрабатывает, но завершения не происходит, OnTerminate не вызывается и поток остается в памяти, хотя уже ничего не делает. Есть какая то особенность в создании потоков в службах? Поток в службе создается в процедуре ServiceThread, вызываю поток как и всегда вызов потока Код:
Test1:=TThreadTest.Create(true);
Test1.FreeOnTerminate:=true;
Test1.Resume;Описание класса Код:
type TThreadTest = class(TThread)
private
ts:TStringList;
public
procedure terminate1(Sender:TObject);
constructor Create(CreateSuspended: Boolean);
procedure execute; override;
end;
constructor TThreadTest.Create(CreateSuspended: Boolean);
begin
inherited;
ts:=TStringlist.Create;
onterminate:=terminate1;
end;
procedure TThreadTest.execute;
begin
inherited;
ts.Text:='START';
ts.SaveToFile('d:\!!_start.txt');
end;
procedure TThreadTest.terminate1;
begin
ts.Text:='END';
ts.SaveToFile('d:\!!_END.txt');
ts.Free;
end;исходник службы слил тут http://www.sql.ru/forum/actualthread...id=340446&pg=5 Подобная проблема на С++ обсуждается тут, но на аглийском не осилил, какой итог, не понял Последний раз редактировалось CarnoPhage, 24.05.2011 в 09:35. |
|
#2
|
|||
|
|||
|
Мтак, вопрос немного меняется, надеюсь я копаю в ту сторону, если нет, то скорее меня остановите, а то эта хрень будет использоваться в очень ответственной структуре.
Поток не выгружается, потому что стопорится на процедуре doTerminate. Код:
procedure TThread.DoTerminate; begin if Assigned(FOnTerminate) then Synchronize(CallOnTerminate); end; Если переписать процедуру под себя Код:
... procedure doterminate;Override; ... procedure TMyThread.doterminate; begin if Assigned(onTerminate) then onTerminate(self); end; То поток завершается и закрывается. От сюда новый вопрос. Почему Synchronize внутри потока вешает этот поток? |
|
#3
|
||||
|
||||
|
может стоит вообще отказаться от TThread и использовать BeginThread-EndThread? всю синхронизацию реализовать самому.
|
|
#4
|
|||
|
|||
|
Цитата:
|