Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
ВнизОдноэкземплярное прилрожение Найти похожие ветки
← →
BIN (2002-10-28 17:14) [0]Запускается программа с ключами, как бы в одном экземпляре, внешне так и выглядит, а на самом деле повторные запуски, с ключами или без, оставляют в памяти куски 3,5 метра, которые приходится удалять вручную. Сама прога около 10 м памяти кушает. Подскажите плиз, в чем дело, или хотя бы общие методы отладки в таких случаях или где можно посмотреть на них!
program FServer;
uses
Forms, Classes, SysUtils,
Windows,
uServer in "uServer.pas" {fmMnServer},
uRecList in "uRecList.pas",
uLogon in "uLogon.pas" {fmLogon};
{$R *.res}
var fmMnServer : TfmMnServer = nil;
FServHandle : THandle;
ParamList : TStringList;
i : integer;
Second : boolean = true;
begin
Application.Initialize;
ParamList := TStringList.Create;
for i :=1 to ParamCount do
begin
ParamList.Add(ParamStr(i));
end;
// fmMnServer.CheckParamList;
// Ищем запущенное приложение
FServHandle := FindWindow("TfmMnServer", "TableScaner");
if FServHandle = 0 then // Если не находим то
begin
// если запущено с ключом Е то
if (AnsiUpperCase(ParamStr(1)) = "/E" )
or (AnsiUpperCase(ParamStr(2)) = "/E" )
then Exit; //Выход из программы
Second := false;
fmMnServer := TfmMnServer.Create(nil); // Создаем форму
FServHandle := fmMnServer.Handle; // присваиваем ее дискриптор
end
else Second := true;
if ParamCount > 0 then
begin
for i := 0 to ParamList.Count - 1 do
begin
if AnsiUpperCase(ParamList.Strings[i]) = "/S" // Показать программу
then SendMessage(FServHandle, WM_FSERVER, FShow,0);
if AnsiUpperCase(ParamList.Strings[i]) = "/H" // Скрыть программу
then SendMessage(FServHandle, WM_FSERVER, FClose,0);
if AnsiUpperCase(ParamList.Strings[i]) = "/E" // Закрыть программу
then SendMessage(FServHandle, WM_FSERVER, FExit,0);
if AnsiUpperCase(ParamList.Strings[i]) = "/P" // Остановить скан
then SendMessage(FServHandle, WM_FSERVER, FStop,0);
if AnsiUpperCase(ParamList.Strings[i]) = "/R" // Запустить скан
then SendMessage(FServHandle, WM_FSERVER, FStart,0);
end;
end;
If Second then Application.Terminate;
ParamList.Free;
try repeat Application.ProcessMessages;
Application.HandleMessage;
until Application.Terminated; // закрываем приложение
finally
if fmMnServer <> nil then
begin
fmMnServer.free; // уничтожаем форму
fmMnServer := nil;
end;
end;
end.
← →
Smithson (2002-10-28 17:18) [1]не
then Exit
, аApplication.Close
← →
BIN (2002-10-29 07:53) [2]не не в этом дело даже ежели Application.Terminate использовать, мусор остается при повторных запусках с любыми ключами или вообще без них. мож еще у кого хотя бы мысли какие есть как из ситуёвины выбраться
← →
Cobalt (2002-10-29 08:43) [3]А как проверяешь наличие "мусора"?
Попробуй так:
Second := false;
Application.Initialize;
fmMnServer := TfmMnServer.Create(nil);
....
If Second then Application.Terminate;
и вместо
try repeat Application.ProcessMessages;
Application.HandleMessage;
until Application.Terminated;
Application.Run;
← →
Andrey007 (2002-10-29 09:32) [4]То есть, Вам нужна блокировка повторных запусков программы?
← →
BIN (2002-10-29 10:23) [5]2 Cobalt
1.Наличие мусора вижу в диспетчере задач / процессы, я под NT
2.так нельзя, здесь нет главной формы, поэтому и применен repeat ... until...
2 Andrey007
да, но еще и управлять программой из командной строки при помощи ключей
← →
Юрий Зотов (2002-10-29 10:31) [6]http://www.delphikingdom.com/helloworld/samples_win.htm
Там три примера решения Вашей задачи, без всяких утечек памяти и более надежные, чем FindWindow(Ex). А 3-й пример - почти прямо Ваша задача и есть.
← →
BIN (2002-10-29 15:48) [7]Все просто оказалось -
If Second then
begin
Application.Terminate;
exit;
end;
Всем большое спасибо
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c