Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть поток, в котором выделены значительные размеры памяти и


Alexander ©   (2003-09-24 11:59:00) 

происходит ошидание определённого процесса. Как можно прибить этот поток, чтобы освободить всю выделенную память?

Вот код для примера:

function Thread(TR: Pointer): Cardinal; stdcall;
var
I, N: Integer;
Mem: array[0..10000] of Pointer;
begin
Result := 0;
N := -1;
try
for I := 0 to 10000 do
begin
GetMem(Mem[I], 100000000);
N := I;
MessageBox(0, PChar(IntToStr(I + StrToInt(IntToStr(Round(I/2))))), "", MB_OK);
end;
finally
for I := 0 to N do
FreeMem(Mem[I]);
MessageBox(0, "", "error", MB_OK);
end;
end;

procedure AddThread;
var
ThreadID: Cardinal;
begin
hThread := CreateThread(nil, 0, @Thread, nil, CREATE_SUSPENDED, ThreadID);
SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
ResumeThread(hThread);
end;


Alexander   (2003-09-24 14:20:00) [1]

Всем спасибо, буду оптимизировать нормальную обработку остановки сервиса.


Digitman   (2003-09-24 14:05:00) [2]


> Alexander


код.поток должен быть ответственен за своевременное и корректное освобождение занимаемых им временных ресурсов

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

при каждой итерации можно проверять вызовом неблок.ф-ции PeekMessage(), нет ли в очереди сообщений, адресованных потоку, некоего предопределенного сообщения, факт наличия которого есть признак команды на немедленное завершение. Т.е. этот факт нужно оформит как условие выхода из цикла.

внешний (по отношению к данному) код.поток (например, код.поток сервиса) при необходимости посылает данному код.потоку предопределенное сообщение вызовом ф-ции PostThreadMessage() и ждет, пока дан.код поток не завершится (см. WaitFor-ф-ции), после чего со спок. "совестью" может двигаться дальше или уже сам завершиться


Alex Konshin   (2003-09-24 13:48:00) [3]

Я по началу его спутал с MessageBox, который из VCL.
Но MessageBox там в любом случае ни к месту.
К VCL-то она может и не привязана, но и прервать-то ее корректно проблематично. Не городить же ради этого цикл обработки сообщений.


Digitman   (2003-09-24 13:30:00) [4]


> Alex Konshin


насчет MessageBox() ты ошибаешься.
вполне допустимо и корректно вызывать эту ф-цию в доп.нити.
к VCL она никак не привязана.


Alex Konshin   (2003-09-24 12:58:00) [5]

Если уж так нужно окошко, привязанное к этой нити, то придется создавать его вручную - VCL работает только в основной нити, и заставлять его работать в других нитях - себе дороже.
В этом случае может пригодится MsgWaitForMultipleObjects.
Хотя, мне не совсем ясно, что будет, если из thread вызвать Windows.MessageBox, возможно, что и прокатит.


Alex Konshin   (2003-09-24 12:53:00) [6]

Жди в потоке правильно. MessageBox там ни к месту.
Создай Event и жди его вместе с другими событиями по WaitForMultipleObjects(Ex).
Основной поток, когда хочет убить тред, выставляет этот Event.
Можно обойтись и одним Event и флагами (выставляещь флаг и Event), короче, решение зависит от задачи.


Alexander   (2003-09-24 12:48:00) [7]

Нет, ничего плохого - просто смоделировал ожидание.
На самом деле в моём потоке происходит длительное вычисление, а дело происходит в сервисе. У меня сервис подвисает при перезагрузке из-за того, что приходится ждать окончания вычислений, а если поток убивать TerminateThread, то ресурсы не освобождаются.


Alex Konshin   (2003-09-24 12:43:00) [8]

Гадость какую-то делаешь


Alexander   (2003-09-24 12:18:00) [9]

Ожидание как-раз есть - каждый раз нужно нажать ОK у сообщения.


Verg   (2003-09-24 12:13:00) [10]


> происходит ошидание определённого процесса


Что-то не наблюдается никакого ожидания, особенно процесса...


> Как можно прибить этот поток, чтобы освободить всю выделенную
> память?


Прибить можно - TerminateThread, освободить память - нет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо