Убить поток
От: Аноним  
Дата: 17.05.07 07:21
Оценка:
Создаю поток. Он вызывает функцию, в которой есть задержка...

procedure Delay(dwMilliseconds: Longint);
 var
   iStart, iStop: DWORD;
 begin
   iStart := GetTickCount;
   repeat
     iStop := GetTickCount;
     Application.ProcessMessages;
   until (iStop - iStart) >= dwMilliseconds;
 end;

Для тестирования ставлю Delay(1000000000).
Затем в какой-то момент мне нужно полность уничтожить поток
Реализовано:

IF Assigned (ParcelThread) Then
      Begin
      TerminateThread(ParcelThread.Handle,ParcelThread.ThreadExitCode);
      FreeAndNil(ParcelThread);
      End;

Но когда пытаюсь закрыть прогу, оказывается поток работает (прога не закрывается, причем ошибок нет)
Подскажите как его зарубить.
P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной
Re: Убить поток
От: OdesitVadim Украина  
Дата: 17.05.07 07:50
Оценка: +1
Здравствуйте, <Аноним>:
поток должен быть готов к завершению. для этого в поток должен время от времени проверять свойство Terminated. Если оно истинно, то он должен по быстрому завершить свои дела и выйти с процедуры Execute с помощью exit. В основной программе просто пишем поток.terminate;
Все другие способы прибить поток до добра не доведут.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Убить поток
От: Аноним  
Дата: 17.05.07 08:09
Оценка:
В том и дело, что поток не готов завершиться... а убить его нужно (в потоке вызвана ф-ция, которая, предположим работает бесконечно долго, в реале конечно такого не будет, но все-таки)
Re[3]: Убить поток
От: OdesitVadim Украина  
Дата: 17.05.07 08:18
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>В том и дело, что поток не готов завершиться... а убить его нужно (в потоке вызвана ф-ция, которая, предположим работает бесконечно долго, в реале конечно такого не будет, но все-таки)

Ну тогда готовся к тому, что убив поток своим образом, ты получаеш утечки памяти. и ничего тут толком не сделаеш. Но если всё таки невозможно разделить процедуру потока на мелкие части, то может выделить в отдельное приложение? Его то можно прибить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Убить поток
От: lapslap  
Дата: 17.05.07 08:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Создаю поток. Он вызывает функцию, в которой есть задержка...


///
А>Но когда пытаюсь закрыть прогу, оказывается поток работает (прога не закрывается, причем ошибок нет)
А>Подскажите как его зарубить.
А>P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной

попробуйте WaitForMultipleObjects. в любой момент сможете свой поток "прибить"
Re: Убить поток
От: Danchik Украина  
Дата: 17.05.07 11:07
Оценка:
Здравствуйте, Аноним, Вы писали:

Милый мой дарагой, кто тебе сказал что Application.ProcessMessages можна/нужно использовать в потоках?

Создай в потоке TSimpleEvent
procedure TMyThread.Delay(dwMilliseconds: Longint);
begin
  FEvent.WaitFor(dwMilliseconds); 
  // если все нормально, будет таймаут, если нет - поток завершился
end;

procedure TMyThread.Terminate;
begin
  inherited Terminate;
  FEvent.SetEvent;
end;
Re[2]: Убить поток
От: Аноним  
Дата: 17.05.07 11:39
Оценка:
Я в потоке это и не использую... мне как-то нужно обойти это... Я жи писал: "P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной"
Re[3]: Убить поток
От: Danchik Украина  
Дата: 17.05.07 11:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я в потоке это и не использую... мне как-то нужно обойти это... Я жи писал: "P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной"


А я что написал? Неужели не обошел?
Re[3]: Убить поток
От: Dimentiy Россия  
Дата: 17.05.07 12:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я в потоке это и не использую... мне как-то нужно обойти это... Я жи писал: "P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной"


То есть ты в потоке вызываешь некий код, про который не знаешь, сколько времени он будет работать, так?
И смысл в том, чтобы прибить поток вместе с вызванным им кодом?

Тогда лучше всего пустить дочернее приложение и с ним уже обмениваться данными.
Все другие способы теоретически неправильны, потому что код, который вы вызываете, может делать явное закрытие какого-то ресурса в конце работы. Если код запускается в отдельном приложении — вы прибьёте приложение с отпусканием всех ресурсов. Если в потоке — будут утечки даже не столько памяти, сколько других полезных вещей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.