OberonCore
https://forum.oberoncore.ru/

WinConsole + Services.Action ?
https://forum.oberoncore.ru/viewtopic.php?f=35&t=3429
Страница 1 из 1

Автор:  Иван Денисов [ Среда, 27 Апрель, 2011 16:18 ]
Заголовок сообщения:  WinConsole + Services.Action ?

Хочу проверить совет, в связи с чем решил собрать безгуевое приложение.
Помогите, пожалуйста, ума не приложу, почему не выводится нужная информация. Я сделал, чтобы приложение принудительно ждало, пока не произойдут вычисления, процедура Do так вроде и не запускается ни разу.
Код:
MODULE MyFpstest;

   IMPORT Kernel, Win := WinApi, Log, Services;

   TYPE
      Action = POINTER TO RECORD (Services.Action) END;
      
   VAR
      time, counter: LONGINT;
      fpsR: REAL;
      ra: Action;

   PROCEDURE ProcessMessages;
      VAR msg: Win.MSG; res: INTEGER;
   BEGIN
      WHILE Win.PeekMessage(msg, 0, 0, 0, Win.PM_REMOVE) # 0 DO
         res := Win.TranslateMessage(msg);
         res := Win.DispatchMessageA(msg)
      END
   END ProcessMessages;

   PROCEDURE (a: Action) Do;
   BEGIN
      fpsR := 1000 / (Kernel.Time() - time);
      time := Kernel.Time();
      Log.Real(fpsR); Log.Ln;
      IF counter < 100 THEN
         INC(counter);
         Services.DoLater(a, Services.now)   
      END
   END Do;

   PROCEDURE Start*;
   BEGIN
      NEW(ra);
      counter := 0;
      Services.DoLater(ra, Services.now);
      Log.String("Start"); Log.Ln;
      WHILE counter < 100 DO
         ProcessMessages;
         Win.Sleep(100);
      END;
   END Start;

BEGIN
   Start
END MyFpstest.

MyFpstest.Start

DevLinker.LinkExe dos test.exe := Kernel$+ Files HostFiles Dates Meta Log Dialog Math Strings WinConsole Meta Services MyFpstest~


Вложения:
Комментарий к файлу: Экстра компонент используемый в программе
WinConsole.txt [5.13 КБ]
Скачиваний: 663

Автор:  Илья Ермаков [ Среда, 27 Апрель, 2011 16:25 ]
Заголовок сообщения:  Re: WinConsole + Services.Action ?

А Action-ы кто крутить будет? :) У гуёвого приложения есть главный оконный цикл. А Вас что есть? :)
Чтобы работали Actions, нужно вызывать Services.actionHook.Loop (кажется, так)

Автор:  Пётр Кушнир [ Среда, 27 Апрель, 2011 18:08 ]
Заголовок сообщения:  Re: WinConsole + Services.Action ?

а главный цикл и оконный это не разные вещи? главный это HostMenus.Loop, а оконный это HostMenus.AppWinHandler

Автор:  Евгений Темиргалеев [ Среда, 27 Апрель, 2011 18:08 ]
Заголовок сообщения:  Re: WinConsole + Services.Action ?

divan, попробуйте этот модуль
Код:
MODULE xxxTimerHook;

   IMPORT
      Out := ConsoleOut,
      Services, SYSTEM, W := WinApi;
   
   VAR
      id: INTEGER;

   PROCEDURE TimerProc (hwnd: W.HWND; uMsg, idEvent, dwTimer: INTEGER);
   BEGIN
      Services.actionHook.Step
   END TimerProc;

   PROCEDURE InstallTimer;
   BEGIN
      id := W.SetTimer(0, 0, 1, SYSTEM.VAL(W.TIMERPROC, SYSTEM.ADR(TimerProc)))
   END InstallTimer;
   
   PROCEDURE UninstallTimer;
      VAR   res: INTEGER;
   BEGIN
      IF id # 0 THEN
         res := W.KillTimer(0, id); id := 0
      END
   END UninstallTimer;
   
BEGIN
   InstallTimer;
   IF id = 0 THEN
      Out.Open; Out.String("xxxTimerHook.InstallTimer failed"); Out.Ln
   END
CLOSE
   UninstallTimer
END xxxTimerHook.

Автор:  Иван Денисов [ Среда, 27 Апрель, 2011 18:54 ]
Заголовок сообщения:  Re: WinConsole + Services.Action ?

Илья Ермаков писал(а):
А Action-ы кто крутить будет? :)

Вау :)
Получился разгон BB (точнее обработки сообщении Services)! Я добавил одну строку, и действительно даже в самом ББ получил желаемые FPS, пока не отследил негативные последствия, правда.
Код:
WHILE counter < 100 DO
   ProcessMessages;
   Services.actionHook.Step;
   Win.Sleep(5);
END;

И в консольном все работает!

Автор:  Иван Денисов [ Среда, 27 Апрель, 2011 19:26 ]
Заголовок сообщения:  Re: WinConsole + Services.Action ?

Евгений Темиргалеев писал(а):
divan, попробуйте этот модуль
Код:
id := W.SetTimer(0, 0, 1, SYSTEM.VAL(W.TIMERPROC, SYSTEM.ADR(TimerProc)))

Есть у этого таймера нехорошие ограничения, не выставишь меньше 10, как я понял, но на деле еще хуже, так порядка 50 и получилось по проверке.
Цитата:
UINT_PTR WINAPI SetTimer(
__in_opt HWND hWnd,
__in UINT_PTR nIDEvent,
__in UINT uElapse,
__in_opt TIMERPROC lpTimerFunc
);
If uElapse is less than USER_TIMER_MINIMUM (0x0000000A), the timeout is set to USER_TIMER_MINIMUM. If uElapse is greater than USER_TIMER_MAXIMUM (0x7FFFFFFF), the timeout is set to USER_TIMER_MAXIMUM.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/