Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.05.2011, 07:39
CarnoPhage CarnoPhage вне форума
Прохожий
 
Регистрация: 06.01.2008
Сообщения: 14
Репутация: 10
По умолчанию Потоки в службе

Здравствуйте! Не хотел писать в своем топе про службы, т.к. вопрос немного другой.

Есть поток, у которого есть процедура 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  
Старый 24.05.2011, 11:10
CarnoPhage CarnoPhage вне форума
Прохожий
 
Регистрация: 06.01.2008
Сообщения: 14
Репутация: 10
По умолчанию

Мтак, вопрос немного меняется, надеюсь я копаю в ту сторону, если нет, то скорее меня остановите, а то эта хрень будет использоваться в очень ответственной структуре.

Поток не выгружается, потому что стопорится на процедуре 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  
Старый 24.05.2011, 11:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

может стоит вообще отказаться от TThread и использовать BeginThread-EndThread? всю синхронизацию реализовать самому.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 24.05.2011, 11:30
CarnoPhage CarnoPhage вне форума
Прохожий
 
Регистрация: 06.01.2008
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
может стоит вообще отказаться от TThread и использовать BeginThread-EndThread? всю синхронизацию реализовать самому.
Возможно, только этот вариант и нагуглил, но хотелось бы все же использовать TThread, но если проще перейти на BeginThread-EndThread, чем подгонять TThread, то конечно, лучше так.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter