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

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

Одноэкземплярное прилрожение [D6, NT4]


BIN ©   (2002-10-28 17:14:00) 

Запускается программа с ключами, как бы в одном экземпляре, внешне так и выглядит, а на самом деле повторные запуски, с ключами или без, оставляют в памяти куски 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.


BIN   (2002-10-29 15:48:00) [1]

Все просто оказалось -

If Second then
begin
Application.Terminate;
exit;
end;

Всем большое спасибо


Юрий Зотов   (2002-10-29 10:31:00) [2]

http://www.delphikingdom.com/helloworld/samples_win.htm

Там три примера решения Вашей задачи, без всяких утечек памяти и более надежные, чем FindWindow(Ex). А 3-й пример - почти прямо Ваша задача и есть.


BIN   (2002-10-29 10:23:00) [3]

2 Cobalt
1.Наличие мусора вижу в диспетчере задач / процессы, я под NT
2.так нельзя, здесь нет главной формы, поэтому и применен repeat ... until...
2 Andrey007
да, но еще и управлять программой из командной строки при помощи ключей


Andrey007   (2002-10-29 09:32:00) [4]

То есть, Вам нужна блокировка повторных запусков программы?


Cobalt   (2002-10-29 08:43:00) [5]

А как проверяешь наличие "мусора"?
Попробуй так:
Second := false;
Application.Initialize;
fmMnServer := TfmMnServer.Create(nil);
....
If Second then Application.Terminate;
и вместо
try repeat Application.ProcessMessages;
Application.HandleMessage;
until Application.Terminated;

Application.Run;



BIN   (2002-10-29 07:53:00) [6]

не не в этом дело даже ежели Application.Terminate использовать, мусор остается при повторных запусках с любыми ключами или вообще без них. мож еще у кого хотя бы мысли какие есть как из ситуёвины выбраться


Smithson   (2002-10-28 17:18:00) [7]

не then Exit, а Application.Close


Наверх

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