Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
Alexander   (2003-09-24 11:59) [0]

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

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

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;


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


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


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


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


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


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

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


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

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


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

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


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

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


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

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


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


> Alex Konshin


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


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

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


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


> Alexander


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

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

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

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


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
1-66005
Ru
2003-11-10 11:16
2003.11.20
Освобождение ресурсов


6-66040
Дмитрий П
2003-09-14 13:15
2003.11.20
Управление LAN интернет-соединением.


1-65908
FC
2003-11-08 14:05
2003.11.20
Запрет вызова контекстного меню в TEdit


8-66015
WInAPi Lamer
2003-06-01 14:55
2003.11.20
Написать под углом...


3-65765
Layner
2003-10-31 11:03
2003.11.20
Какое событие совершает DBGrid (EhDBGrid) после перехода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский