Как очистить память от выполненых процессов?
Процесс довольно долгий и после длительной работы программа занимает много памяти и работает очень туго в плоть до сильной загрузки ОС. как правильно вычистить, переменные которые создавали ранее запущеные процессы, и сам процесс?
Подскажите пожалуйста, проблема такова: есть программа создающая определённое количество потоков, после завершения обработки одного потока он закрывается и создаются следушие и т.д.
Процесс довольно долгий и после длительной работы программа занимает много памяти и работает очень туго в плоть до сильной загрузки ОС. как правильно вычистить, переменные которые создавали ранее запущеные процессы, и сам процесс?
Написать правильный код, где потоки будут завершаться не принудительно из вне, а "своей смертью", когда поступает соответствующее событие (Event). Соответственно, тогда локальные для потока ресурсы должны создаваться и удаляться в потоке.
Кстати, а у тебя потоки с GDI случаем не работают? Может ты ресурсы GDI исчерпываешь?
Написать правильный код, где потоки будут завершаться не принудительно из вне, а "своей смертью", когда поступает соответствующее событие (Event). Соответственно, тогда локальные для потока ресурсы должны создаваться и удаляться в потоке.
Кстати, а у тебя потоки с GDI случаем не работают? Может ты ресурсы GDI исчерпываешь?
У меня потоки создают API сокеты и ешё из них выводятся локальные данные что бы контролировать процесс(Количество потоков в работе, количество отработаных потоков и т.д.)
.Execute;
begin
...
end;
присутствует: try Terminate except end;
и в
.Execute;
begin
...
end;
присутствует: try Terminate except end;
Не надо использовать Terminate, просто завершай процедуру Execute (например, с помощью Exit). Кроме того, посмотри, завершаются ли потоки в TaskManager'е.
Не надо использовать Terminate, просто завершай процедуру Execute (например, с помощью Exit). Кроме того, посмотри, завершаются ли потоки в TaskManager'е.
А если допустм поток запустил функцию из DLL, как его тогда завершить в теле? А функция Terminate поток не убъет, а всего лишь сгенерирует исключение. Используй API функцию для убиения гадов(TerminateTread).
А если допустм поток запустил функцию из DLL, как его тогда завершить в теле? А функция Terminate поток не убъет, а всего лишь сгенерирует исключение. Используй API функцию для убиения гадов(TerminateTread).
Так, так... Посмотрим, что скажет на это Microsoft...
TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.
TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.
То есть использование этой функции не есть гут. Поток, запустивший функцию из DLL, должен по ее корректному завершению должен получить управление обратно, или я не прав? ;)
То есть использование этой функции не есть гут. Поток, запустивший функцию из DLL, должен по ее корректному завершению должен получить управление обратно, или я не прав? ;)
Да должен по идеи, но допустим в dll шифруется файл, а пользователь решил прекратить процесс, в таком случаи я передаю в dll сигнал отмены, по сылке конечно(var) и она завершается. А вообще в Visual C++ есть функции килленга процессов, а в Delphi нет.