![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Snake_B |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
1) вот... примерно так... procedure TFormWinHide.SearchWindow вызывается таймером каждые 100 мс... идет утечка памяти... не могу разабраться откуда... 2) а можно не по таймеру окна искать, а по системному сообщению (изменилось общее количество окон или одно из окон изменило статус с "IsWindowVisible(Wnd)" и наоборот)? если да, то как... 3) Ну это к другой теме, но спрошу здесь же... в контекстном меню задаю для пункта hint, ноль эмоций.. что надо сделать, чтобы он там отображался? |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата идет утечка памяти... не могу разабраться откуда... Вопрос на засыпку: с чего ты решил про утечку? Запустил приложение, оно отработало больше 7 минут, после первых 10 секунд работы максимальный объем используемой памяти не увеличился.Цитата а можно не по таймеру окна искать, а по системному сообщению По таймеру гораздо проще, но можно ставить хук на CreateProcess/ZwCreateProcess, если хочешь - спроси у Гугля...Цитата в контекстном меню задаю для пункта hint, ноль эмоций.. что надо сделать, чтобы он там отображался? Читать здесь: http://delphi.about.com/od/vclusing/a/menuitemhints.htmСообщение отредактировано: volvo - 7.08.2008 18:30 |
Snake_B |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вопрос на засыпку: с чего ты решил про утечку? Запустил приложение, оно отработало больше 7 минут, после первых 10 секунд работы максимальный объем используемой памяти не увеличился. По таймеру гораздо проще, но можно ставить хук на CreateProcess/ZwCreateProcess, если хочешь - спроси у Гугля... Читать здесь: http://delphi.about.com/od/vclusing/a/menuitemhints.htm про утечку... диспечер задач, до запуска - выделение памяти - 842 мб через 10 секунд - 890 мб через 20 - 920 ну и так далее (в первый раз, пока сообразил, 1700 мб было )... но в процессах память не растет ни у bds, ни у программы... при запуске не из делфи, а просто программы таже фигня... при закрытии программы память падает до значения перед запуском... // name:=GetWindowPatch(Wnd); отключаю эту строку, всё нормально... Win XP sp2, delphi 2005... проще, так проще... англицкий будем учить :-) |
Snake_B |
![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
англицкий будем учить :-) там про главное меню... сделела не много по другому... может кому пригодится... ну и за одно может кто скажет де ошибки =) unit main; ну вопрос про память в силе.. |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Хэндлы освобождать не пробовал?
function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray; ? Кстати, в конце GetWindowPatch() можно было бы и SetLength(modarr, 0) добавить, на всякий случай. |
Snake_B |
![]()
Сообщение
#6
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хэндлы освобождать не пробовал? Кстати, в конце GetWindowPatch() можно было бы и SetLength(modarr, 0) добавить, на всякий случай. спасиба... ввиду того что самоучка - не которые простые моменты для меня неизвестны... а вот сама функция GetModulesListByProcessId(ProcessId : Cardinal) целиком скопирована из DRKB... там про хэндлы тоже видать не знали ![]() |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата а вот сама функция GetModulesListByProcessId(ProcessId : Cardinal) целиком скопирована из DRKB... А в DRKB она была включена с одного из программерских форумов, там написано с какого... А запостил ее туда один из участников, который по какой-то причине пропустил эту строчку... А автор вопроса, на который он отвечал, не посмотрел сразу, что приложение "забирает" память, и не спросил, "почему", вот тебе и недочет... Все люди, все ошибаются... |
Snake_B |
![]()
Сообщение
#8
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
А в DRKB она была включена с одного из программерских форумов, там написано с какого... А запостил ее туда один из участников, который по какой-то причине пропустил эту строчку... А автор вопроса, на который он отвечал, не посмотрел сразу, что приложение "забирает" память, и не спросил, "почему", вот тебе и недочет... Все люди, все ошибаются... извиняюсь конечно за оффтоп... но в принципе я их понимаю... уже в парочке программ эту функцию использовал.. но там она один раз вызывалась... |
Snake_B |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
вот тут парочку вопросов появилось... по теме где то близко...
procedure WinExeToBMP(patch: string; Image: TbitMap); // Извлечение иконки из ехе файла... вот примерно такая функция... иногда выдает ошибку "EOutOfResources" и сообщение - "Не хватает ресурсов для выполнения операции" (примерно, точно не помню).... через try except не ловится... т.е. он отрабатывает, но уже после системного сообщения... куда тут копать хоть? |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата куда тут копать хоть? В MSDN: ExtractIcon FunctionЦитата Remarks У тебя этого не делается, вот тебе и утечка.This function is not supported for icons in 16-bit executables and DLLs. You must destroy the icon handle returned by ExtractIcon by calling the DestroyIcon function. |
Snake_B |
![]()
Сообщение
#11
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
точно... из-за этого... спасибо... |
Гость |
![]()
Сообщение
#12
|
Гость ![]() |
Как пользоваться этой функцией????
Цитата function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray; var hSnapshot : THandle; lpme : TModuleEntry32; procedure AddModuleToList; begin SetLength(Result,High(Result)+2); Result[high(Result)]:=lpme; end; begin SetLength(Result,0); hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId); if hSnapshot=-1 then RaiseLastWin32Error; lpme.dwSize:=SizeOf(lpme); if Module32First(hSnapshot,lpme) then begin AddModuleToList; while Module32Next(hSnapshot,lpme) do AddModuleToList; end; CloseHandle(hSnapshot); // <--- Вот так, например ... end; |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
В самом первом сообщении темы был приведен пример использования.
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 5:31 |