|
#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
|
|||
|
|||
Цитата:
|