Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.105.124] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Добрый день! Подскажите пожалуйста, как сделать, чтобы консольное приложение не закрывалось после выполнения всего кода, а продолжало висеть? Или указать точное время работы приложения.
|
Сообщ.
#2
,
|
|
|
ReadLn ??
|
Сообщ.
#3
,
|
|
|
Да, спасибо. Но почему-то таймер у меня не отрабатывает...
program PingAndMsg_Console; {$APPTYPE CONSOLE} uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient, ExtCtrls; type TEventHandler = class class procedure OnReply(ASender: TComponent; const AReplyStatus: TReplyStatus); class procedure OnTimer(Sender: TObject); end; var IdIcmpClient1: TIdIcmpClient; Timer1: TTimer; class procedure TEventHandler.OnReply(ASender: TComponent; const AReplyStatus: TReplyStatus); var Str: AnsiString; iWinExec: Integer; begin { Если пинг прошел успешно, то отсылаем сообщение } If AReplyStatus.MsRoundTripTime<1000 then begin Str:= 'cmd.exe /c net send PROG' + ' "Вас ждут неподписанные заказы!"'; iWinExec:= WinExec(PAnsiChar(Str), SW_HIDE); {If iWinExec>31 then ShowMessage('WinExec отработала успешно!'); } end end; class procedure TEventHandler.OnTimer(Sender: TObject); begin with IdIcmpClient1 do begin Host:= '10.10.1.7'; ReceiveTimeout:= 1001; Ping; end; end; begin { TODO -oUser -cConsole Main : Insert code here } Timer1:= TTimer.Create(nil); with Timer1 do begin OnTimer:= TEventHandler.OnTimer; Enabled:= True; Interval:= 3000; end; IdIcmpClient1:= TIdIcmpClient.Create(nil); with IdIcmpClient1 do begin OnReply:= TEventHandler.OnReply; Host:= '10.10.1.7'; ReceiveTimeout:= 1001; Ping; end; end. |
Сообщ.
#4
,
|
|
|
Цитата Leklerk @ Но почему-то таймер у меня не отрабатывает... "Уж сколько раз твердили миру", что TTimer работает на виндовых сообщениях WM_TIMER и соотв-но для него нужен цикл выборки сообщений на Get\PeakMessage или Application.ProcessMessages и т.п. |
Сообщ.
#5
,
|
|
|
leo, покажите пожалуйста, как выглядит такой цикл (лучше с Application.ProcessMessages).
|
Сообщ.
#6
,
|
|
|
Цитата Leklerk @ как выглядит такой цикл (лучше с Application.ProcessMessages). Ну если с Application, то "лучше" c HandleMessage repeat Application.HandleMessage; until Apllication.Terminated or (...); //<- твое условие завершения |
Сообщ.
#7
,
|
|
|
leo, ну и куда мне это ставить? Мне же нужно просто, чтобы таймер работал...
|
Сообщ.
#8
,
|
|
|
Цитата Leklerk @ leo, ну и куда мне это ставить? В конец проги. Это не только "просто, чтобы таймер работал", а еще и ответ на основной вопрос топика - чтобы приложение не закрывалось, а "висело". Как твой таймер сделает все свои дела, можно вызвать Application.Terminate или установить какой-то другой свой флаг, по которому прога выйдет из цикла repeat и завершится |
Сообщ.
#9
,
|
|
|
Спасибо, так действительно работает!
|
Сообщ.
#10
,
|
|
|
Цитата Leklerk @ leo, покажите пожалуйста, как выглядит такой цикл (лучше с Application.ProcessMessages). Откуда application в консольном приложение |
Сообщ.
#11
,
|
|
|
Цитата Anatoly Podgoretsky @ Откуда application в консольном приложение Как обычно, из модуля Forms Добавлено PS: Можно конечно и не связываться с Application, а написать свой простейший цикл обработки сообщений на GetMessage\DispatchMessage, или еще лучше\круче - вместо TTimer использовать Create\SetWaitableTimer + WaitForSingleObject |
Сообщ.
#12
,
|
|
|
А чем timeSetEvent из MMSystem не устроил?
|
Сообщ.
#13
,
|
|
|
Цитата Mr. Gonarh @ А чем timeSetEvent из MMSystem не устроил? Тем, что он срабатывает в отдельном потоке => нужны лишние телодвижения по созданию\ожиданию эвента, или какие-то другие способы синхронизации и ожидания |
Сообщ.
#14
,
|
|
|
Цитата leo @ Можно конечно и не связываться с Application, а написать свой простейший цикл обработки сообщений на GetMessage\DispatchMessage Покажите пожалуйста, если кода немного. |
Сообщ.
#15
,
|
|
|
//uses Windows; //var // Msg:TMsg; while GetMessage(Msg,0,0,0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; Чтобы выйти из цикла и завершить прогу можно из процедуры таймера вызвать PostQuitMessage(0); |