![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как оставить приложение без окна выполнятся до окончания работы Windows? [D5, Win95/98, NT4, Win2k]
Valdemar © (2002-01-16 12:36:00)Я создал приложение в котором нет окон (есть только модули). Мне надо чтобы это приложение висело в памяти и закрывалось только когда его закроют через Ctrl+Alt+Del или при завершении работы Windows.
Заранее спасибо.
Набережных С. (2002-01-17 19:53:00) [1]В приведенном коде exit следует заменить на Break, строку Application.Run поставить после until false, а строки try и finally удалить.
Valdemar (2002-01-17 19:05:00) [2]Большое всем спасибо эту проблему с вашей помощью я решил.
Если комуто интересно то вот кусок исходника:
var Msg: TMsg;
begin
Application.Initialize;
Application.Title := "MyProg";
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(TDataModule2, DataModule2);
try
repeat
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
case Msg.Message of
WM_Quit:exit;
wm_Close:exit;
wm_Destroy:exit;
end;
until false
finally
end;
Application.Run;
end.
Набережных С. (2002-01-17 16:25:00) [3]В примере забыл про цикл:
1. Сразу после try вставить repeat;
2. Перед finally вставить until false;
Набережных С. (2002-01-17 16:16:00) [4]Если в программе нет MainForm, то прогамма и будет сразу
закрываться. Нужно из файла проекта удалить строку
Application.Run и вместо нее вставить свою процедуру выборки
и обработки сообщений по примеру Application.ProcessMessage.
Просмотрите цепочку
Application.Run -> HandleMessage -> ProcessMessage.
Набережных С. (2002-01-17 16:05:00) [5]Если программа работает не внутри Application.Run, то она должна выглядеть примерно так:
var Msg: TMsg;
begin
{захват ресурсов}
try
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
case Msg.Message of
WM_QUIT:Exit;
{Можно предусмотреть обработку других сообщений}
end;
{Выполняешь свою работу}
finally
{Освобождение ресурсов}
end;
end;
Можно и подругому, главное - периодически проверять очередь и при получении WM_QUIT завершать приложение.
Valdemar (2002-01-17 16:05:00) [6]procedure TDataModule2.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
MySocket: TWinSocketStream;
tr:Trec;
begin
MySocket := TWinSocketStream.Create(Socket,60000);
while not MySocket.WaitForData(100) do
Application.ProcessMessages;
MySocket.ReadBuffer(tr,sizeof(tr));
MySocket.Free;
//write in database
datamodule1.ADOTable1.Insert;
datamodule1.ADOTable1.Fields[0].AsString:=tr.User;
datamodule1.ADOTable1.Fields[1].AsString:=tr.Path;
datamodule1.ADOTable1.Fields[2].AsString:=tr.Title;
datamodule1.ADOTable1.Fields[3].AsDateTime:=tr.StartTime;
datamodule1.ADOTable1.Fields[4].AsDateTime:=tr.EndTime;
end;
procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
ServerSocket1.Active:=true;
end;
procedure TDataModule2.DataModuleDestroy(Sender: TObject);
begin
ServerSocket1.Active:=false;
ServerSocket1.Close;
end;
При таком раскладе у меня програма сразу после запуска закрывается.
Digitman (2002-01-17 14:39:00) [7]А при чем здесь - есть окно или нет его ? ServerSocket создает собственное для работы с гнездовыми событиями на уровне Win-сообщений. Проблема у тебя в чем-то другом. Приводи фрагменты кода
Valdemar (2002-01-17 14:33:00) [8]Суть в том как сделать чтоб она вертелась и в тоже время что бы была возможность обработки событий serversocket. А то у меня получается что программа запускается, я открываю сокет и сразу закругляется.
Digitman (2002-01-17 10:40:00) [9]Это понятно. Так, а проблемы-то какие ? Ну, запустил ты задачу свою, визуально она себя нигде не обнаруживает, кроме как в списке задач. Пользователь закрыть ее не сможет традиционным способом, и задача будет "крутиться по хозяйству" до тех пор, пока не сочтет нужным завершиться либо возникнут два указанных тобой события (принудительное ее снятие в TaskManager"е и завершение сеанса работы ОС)
Valdemar (2002-01-16 22:30:00) [10]В моём примере нету форм но оно не консольное.
Я кладу в модуль компонент TServerSocket и мне надо чтоб этот компонент сканировал порты поак работает ОС.
Digitman (2002-01-16 13:53:00) [11]А какие прочие существующие (кроме явно указанных), на твой взгляд, варианты завершения приложения тебя не устраивают ? И что значит - "нет окон" ? У тебя консольное приложение ? Или ты просто ни одну форму не создаешь в нем ? Ведь если приложение использует объект Application, то в нем все равно существует по кр.мере одно окно, даже если не создается ни одна форма (окно Windows и форма Делфи - далеко не одно и то же !!)