Создаю поток. Он вызывает функцию, в которой есть задержка...
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. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной
Здравствуйте, <Аноним>:
поток должен быть готов к завершению. для этого в поток должен время от времени проверять свойство Terminated. Если оно истинно, то он должен по быстрому завершить свои дела и выйти с процедуры Execute с помощью exit. В основной программе просто пишем поток.terminate;
Все другие способы прибить поток до добра не доведут.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Убить поток
От:
Аноним
Дата:
17.05.07 08:09
Оценка:
В том и дело, что поток не готов завершиться... а убить его нужно (в потоке вызвана ф-ция, которая, предположим работает бесконечно долго, в реале конечно такого не будет, но все-таки)
Здравствуйте, <Аноним>, Вы писали:
А>В том и дело, что поток не готов завершиться... а убить его нужно (в потоке вызвана ф-ция, которая, предположим работает бесконечно долго, в реале конечно такого не будет, но все-таки)
Ну тогда готовся к тому, что убив поток своим образом, ты получаеш утечки памяти. и ничего тут толком не сделаеш. Но если всё таки невозможно разделить процедуру потока на мелкие части, то может выделить в отдельное приложение? Его то можно прибить.
Здравствуйте, Аноним, Вы писали:
А>Создаю поток. Он вызывает функцию, в которой есть задержка...
/// А>Но когда пытаюсь закрыть прогу, оказывается поток работает (прога не закрывается, причем ошибок нет) А>Подскажите как его зарубить. А>P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной
попробуйте WaitForMultipleObjects. в любой момент сможете свой поток "прибить"
Милый мой дарагой, кто тебе сказал что 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. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной"
Здравствуйте, Аноним, Вы писали:
А>Я в потоке это и не использую... мне как-то нужно обойти это... Я жи писал: "P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной"
Здравствуйте, Аноним, Вы писали:
А>Я в потоке это и не использую... мне как-то нужно обойти это... Я жи писал: "P.S. Могу реализовать только часть с потоком, то что он вызывает реализовано не мной"
То есть ты в потоке вызываешь некий код, про который не знаешь, сколько времени он будет работать, так?
И смысл в том, чтобы прибить поток вместе с вызванным им кодом?
Тогда лучше всего пустить дочернее приложение и с ним уже обмениваться данными.
Все другие способы теоретически неправильны, потому что код, который вы вызываете, может делать явное закрытие какого-то ресурса в конце работы. Если код запускается в отдельном приложении — вы прибьёте приложение с отпусканием всех ресурсов. Если в потоке — будут утечки даже не столько памяти, сколько других полезных вещей.