На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как сделать, чтобы приложение висело?
    Добрый день! Подскажите пожалуйста, как сделать, чтобы консольное приложение не закрывалось после выполнения всего кода, а продолжало висеть? Или указать точное время работы приложения.
      ReadLn ??
        Да, спасибо. Но почему-то таймер у меня не отрабатывает...
        ExpandedWrap disabled
          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.
          Цитата Leklerk @
          Но почему-то таймер у меня не отрабатывает...

          "Уж сколько раз твердили миру", что TTimer работает на виндовых сообщениях WM_TIMER и соотв-но для него нужен цикл выборки сообщений на Get\PeakMessage или Application.ProcessMessages и т.п.
            leo, покажите пожалуйста, как выглядит такой цикл (лучше с Application.ProcessMessages).
              Цитата Leklerk @
              как выглядит такой цикл (лучше с Application.ProcessMessages).

              Ну если с Application, то "лучше" c HandleMessage
              ExpandedWrap disabled
                repeat
                  Application.HandleMessage;
                until Apllication.Terminated or (...); //<- твое условие завершения
                leo, ну и куда мне это ставить? Мне же нужно просто, чтобы таймер работал...
                Сообщение отредактировано: Leklerk -
                  Цитата Leklerk @
                  leo, ну и куда мне это ставить?

                  В конец проги. Это не только "просто, чтобы таймер работал", а еще и ответ на основной вопрос топика - чтобы приложение не закрывалось, а "висело". Как твой таймер сделает все свои дела, можно вызвать Application.Terminate или установить какой-то другой свой флаг, по которому прога выйдет из цикла repeat и завершится
                    Спасибо, так действительно работает!
                      Цитата Leklerk @
                      leo, покажите пожалуйста, как выглядит такой цикл (лучше с Application.ProcessMessages).

                      Откуда application в консольном приложение
                        Цитата Anatoly Podgoretsky @
                        Откуда application в консольном приложение

                        Как обычно, из модуля Forms :D

                        Добавлено
                        PS: Можно конечно и не связываться с Application, а написать свой простейший цикл обработки сообщений на GetMessage\DispatchMessage, или еще лучше\круче - вместо TTimer использовать Create\SetWaitableTimer + WaitForSingleObject
                        Сообщение отредактировано: leo -
                          А чем timeSetEvent из MMSystem не устроил?
                            Цитата Mr. Gonarh @
                            А чем timeSetEvent из MMSystem не устроил?

                            Тем, что он срабатывает в отдельном потоке => нужны лишние телодвижения по созданию\ожиданию эвента, или какие-то другие способы синхронизации и ожидания
                              Цитата leo @
                              Можно конечно и не связываться с Application, а написать свой простейший цикл обработки сообщений на GetMessage\DispatchMessage

                              Покажите пожалуйста, если кода немного.
                              Сообщение отредактировано: Leklerk -
                                ExpandedWrap disabled
                                  //uses Windows;
                                  //var
                                  //  Msg:TMsg;
                                  while GetMessage(Msg,0,0,0) do
                                  begin
                                     TranslateMessage(Msg);
                                     DispatchMessage(Msg);
                                  end;

                                Чтобы выйти из цикла и завершить прогу можно из процедуры таймера вызвать PostQuitMessage(0);
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0351 ]   [ 15 queries used ]   [ Generated: 25.07.21, 11:19 GMT ]