Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
ВнизКак оставить приложение без окна выполнятся до окончания работы Windows? Найти похожие ветки
← →
Valdemar (2002-01-16 12:36) [0]Я создал приложение в котором нет окон (есть только модули). Мне надо чтобы это приложение висело в памяти и закрывалось только когда его закроют через Ctrl+Alt+Del или при завершении работы Windows.
Заранее спасибо.
← →
Digitman (2002-01-16 13:53) [1]А какие прочие существующие (кроме явно указанных), на твой взгляд, варианты завершения приложения тебя не устраивают ? И что значит - "нет окон" ? У тебя консольное приложение ? Или ты просто ни одну форму не создаешь в нем ? Ведь если приложение использует объект Application, то в нем все равно существует по кр.мере одно окно, даже если не создается ни одна форма (окно Windows и форма Делфи - далеко не одно и то же !!)
← →
Valdemar (2002-01-16 22:30) [2]В моём примере нету форм но оно не консольное.
Я кладу в модуль компонент TServerSocket и мне надо чтоб этот компонент сканировал порты поак работает ОС.
← →
Digitman (2002-01-17 10:40) [3]Это понятно. Так, а проблемы-то какие ? Ну, запустил ты задачу свою, визуально она себя нигде не обнаруживает, кроме как в списке задач. Пользователь закрыть ее не сможет традиционным способом, и задача будет "крутиться по хозяйству" до тех пор, пока не сочтет нужным завершиться либо возникнут два указанных тобой события (принудительное ее снятие в TaskManager"е и завершение сеанса работы ОС)
← →
Valdemar (2002-01-17 14:33) [4]Суть в том как сделать чтоб она вертелась и в тоже время что бы была возможность обработки событий serversocket. А то у меня получается что программа запускается, я открываю сокет и сразу закругляется.
← →
Digitman (2002-01-17 14:39) [5]А при чем здесь - есть окно или нет его ? ServerSocket создает собственное для работы с гнездовыми событиями на уровне Win-сообщений. Проблема у тебя в чем-то другом. Приводи фрагменты кода
← →
Набережных С. (2002-01-17 16:05) [6]Если программа работает не внутри 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) [7]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;
При таком раскладе у меня програма сразу после запуска закрывается.
← →
Набережных С. (2002-01-17 16:16) [8]Если в программе нет MainForm, то прогамма и будет сразу
закрываться. Нужно из файла проекта удалить строку
Application.Run и вместо нее вставить свою процедуру выборки
и обработки сообщений по примеру Application.ProcessMessage.
Просмотрите цепочку
Application.Run -> HandleMessage -> ProcessMessage.
← →
Набережных С. (2002-01-17 16:25) [9]В примере забыл про цикл:
1. Сразу после try вставить repeat;
2. Перед finally вставить until false;
← →
Valdemar (2002-01-17 19:05) [10]Большое всем спасибо эту проблему с вашей помощью я решил.
Если комуто интересно то вот кусок исходника:
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 19:53) [11]В приведенном коде exit следует заменить на Break, строку Application.Run поставить после until false, а строки try и finally удалить.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c