На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Задержка в Pascal
    Столкнулся с такой проблемой: мне нужно что бы моя программа (паскаль, но под виндоус) ждала какого-то события. Долго искал.. все, что смог найти сводится к:

    ExpandedWrap disabled
      procedure Pause( p : longint );
      var T : longint;
      begin
      T := ReadTimer + p;
      repeat until T <= ReadTimer;
      end;


    ну или через GetTickCount - не важно.. Во всем этом нужно делать бесконечный цикл, а это очень сильно сказывается на процессоре. Т.е. когда это программа под Дос - это не важно, а вот если под виндоус - виндоус начинает жутко тормозить, пока моя программа обрабатывает цикл repeat until [что-то там].. Как с этим можно справиться?
    По идее, программа должна передать управление виндоусу на Х миллисекунд.. Но как это сделать?

    З.Ы. Пробовал SetTimer, но не получилось с ним толком разобраться. То что у меня получилось сводилось к тому же - программа должна что-то "делать" пока не запустится процедура из SetTimer'а
    Сообщение отредактировано: *Max* -
      Хм. Когда ты пишешь программы под Windows, система сама разберется, как и кому передавать управление. А специального средства передать упреавление Windows используя фактически средства DOS, не существует
      There're only 10 types of people - those who can understand binary and those, who can't.
        обычно ДОСовые события передаются через глобальные переменные, например так:
        ExpandedWrap disabled
          var GlobalFlag:boolean;
          procedure Int08Handler:interrupt;
          begin
            asm pushf; call dword ptr ds:OldInt08 end; {вызываем старый обработчик}
            if blablabla then GlobalFlag:=true;
          end;
          ....
          while not GlobalFlag do {что-либо, в циклах до события};


        Добавлено в :
        а виндовые примерно так же, но через хэндлеры. Вроде бы была такая процедура Yield; без параметров, передающая управление виндам с сохранением состояния задачи. В ВР7.0 она может и быть актуальной.
        Долог путь в бессмертие... я еще вернусь.
        Профильный скилл "Телепатия" 8%
        ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
        Прошу потестить игру.
          Цитата Eiden @ 28.06.04, 01:39
          Хм. Когда ты пишешь программы под Windows, система сама разберется, как и кому передавать управление.

          Система-то разбирается.. но вопрос на сколько каряво? к примеру если в цикле изменить на:
          ExpandedWrap disabled
            repeat writeln until T <= ReadTimer;
          - то уже становится намного лучше.. но это все равно бред какой-то.

          В WinAPI нашел такую процедуру: Sleep(x). Это и есть передача управления виндоусу на Х миллисекунд. В Си она находится с модуле "windows.h" а вот где она в паскале? Как ее вызвать из паскаля? (в хелпе понятно ничего про нее)


          Еще нашел такую загадочную процедуру как WaitMessage
          WaitMessage (Windows API procedure)
          Declaration
          procedure WaitMessage;

          Description
          Yields control to other applications and does not return until a message becomes available in the application queue.


          По-идее это как раз то что нужно.. работает лучше но все равно каряво.

          Добавлено в :
          Цитата Vesper @ 28.06.04, 11:25
          Вроде бы была такая процедура Yield; без параметров, передающая управление виндам с сохранением состояния задачи. В ВР7.0 она может и быть актуальной.

          Хм.. По сравнению со всем предыдущим - работает супер.. Виндоус почти не тормозит от моей программы в 10 кб.. :)
          Сообщение отредактировано: *Max* -
            Не знаю как в BP7, но в Delphi и Free Pascal функция sleep() (как и многие другие функции WinAPI) находятся в модуле winsows:
            ExpandedWrap disabled
              uses windows;

            А еще что-то припоминаю про функцию delay() в модуле CRT...
            May the Source be with you!
              Trustmaster, crt'шный делэй вообще-то безнадежно устарел :) и годен только на генерацию рантайм-ерроров :lol:
              Цитата
              *Max*, 28.06.04, 13:47
              Виндоус почти не тормозит от моей программы в 10 кб..

              то есть все равно тормозит? Кхм... Попробуй поставь цикл типа
              ExpandedWrap disabled
                repeat Yield; until kakoe_to_message;
              Долог путь в бессмертие... я еще вернусь.
              Профильный скилл "Телепатия" 8%
              ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
              Прошу потестить игру.
                Цитата
                то есть все равно тормозит? Кхм... Попробуй поставь цикл типа
                repeat Yield; until kakoe_to_message;


                Так и делаю..


                2 all

                Посоветуйте на чем лучше писать - должно получиться КОМПАКТНОЕ приложение.. Делфи не подходит по определению.. 15 Бк пустого консоль приложение не катит. Пытался вот писать на Паскале под виндоус - меня убило что там нету встроенного отладчика + глюки с подключение модулей - в хелпе толком ничего нету, а угадать самому в какой модуле находится та или другая функция - не реально.
                Начал уже читать Си.. все супер - а приложение все равно компилируются очень большими.. 45-50 бк просто вывод текста..

                ЗЫ На асм перереходить не очень хочется.. геморойно это все-таки.. :/
                Сообщение отредактировано: *Max* -
                  Хм. Раздел не про C, но все же.
                  Если там все правильно сделать, то размеры будут и меньше.

                  Что тебе нужно? Консольное приложение? А почему так критичен размер?
                  There're only 10 types of people - those who can understand binary and those, who can't.
                    Цитата
                    Что тебе нужно? Консольное приложение? А почему так критичен размер?


                    Хотел разобраться с консольными приложениями в виндоусе. Что оно будет делать - не важно - общий случай. Первая проблема которая возникла была связана с задержкой. Но с этим вроде разобрались. Процедура Yield дает не плохой результат.

                    Далее встал вопрос с размере. Все таки разница в размере дос приложения и виндоус в 50 раз - довольно существенно. Вот начал интересоваться..
                    Возможно это настройки компилятора, возможно просто старая версия компилятора (хотя я сильно сомневаюсь что в новой размер экзешника будет меньше, скорее наоборот).. может еще что-то.. Вот поэтому и спрашиваю.. :)

                    Добавлено в :
                    Может можно как-то использовать исключительно модули виндоуса, не подключая в экзешник "родные" паскаля\си? Это должно резко сократить код.

                    Добавлено в :
                    Кстати форум не реагирует на разницу в часовых поясах:

                    Сообщ. #9 сегодня, 17:08 - явно "серверное" время
                    Через 2 минуты я дополняю:
                    Добавлено в 16:10 - "мое" время

                    ;)
                      *Max*,
                      как тебе сказал уже Trustmaster, подключи модуль Windows, и используй Sleep() [Free Pascal / TMT]

                      А если хочешь получить маленький размер ЕХЕ файла, пиши на Ассемблере (тогда тебе в другой раздел). Но, по-моему, излишня такая придирчивость к размеру приложения, она не оправдана.

                      Добавлено в :
                      Также можно упаковать ехешник такими пакерами, как UPX, ASPack, ...
                      Если это сильно критично. Но тогда это ОТДЕЛЬНАЯ тема для обсуждения!
                        Цитата
                        Vesper, 29.06.04, 10:04
                        Trustmaster, crt'шный делэй вообще-то безнадежно устарел и годен только на генерацию рантайм-ерроров
                        Не надо...
                        http://pascal.sources.ru/cgi-bin/show.cgi?...oming&id=newcrt

                        По поводу темы...
                        ExpandedWrap disabled
                          repeat
                            asm
                              mov ax,1680h
                              int 2Fh
                            end
                          until УсловиеВыхода
                        vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
                          Поделюсь одним секретом по сжатию под Win32:
                          1) Упаковываешь exe-шник при помощи UPX (http://upx.sf.net);
                          2) А потом выполняешь "Rebuild PE" в PE-Tools(http://www.uinc.ru).
                          В результате даже весьма приличные приложения (на Free Pascal, например) сжимаются до малых размеров.
                          May the Source be with you!
                            Всем спасибо за ответы. Уже начал качать Free Pascal.. не нашел его у себя. Попробую там поиграться.

                            А тему о размере файлов думаю нужно будет поднять (если ее не подняли до меня конечно :) ).. Все таки это не дело.. Да, я не спорю - бывают ситуации когда можно спокойно писать на Делфи и не парить мозги тем, что у тебя пустая форма компилируется в 400 Бк.. Но иногда это явно не подходит.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script Execution time: 0,1356 ]   [ 16 queries used ]   [ Generated: 24.05.19, 13:04 GMT ]