На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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, не существует
        обычно ДОСовые события передаются через глобальные переменные, например так:
        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 она может и быть актуальной.
          Цитата 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...
              Trustmaster, crt'шный делэй вообще-то безнадежно устарел :) и годен только на генерацию рантайм-ерроров :lol:
              Цитата
              *Max*, 28.06.04, 13:47
              Виндоус почти не тормозит от моей программы в 10 кб..

              то есть все равно тормозит? Кхм... Попробуй поставь цикл типа
              ExpandedWrap disabled
                repeat Yield; until kakoe_to_message;
                Цитата
                то есть все равно тормозит? Кхм... Попробуй поставь цикл типа
                repeat Yield; until kakoe_to_message;


                Так и делаю..


                2 all

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

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

                  Что тебе нужно? Консольное приложение? А почему так критичен размер?
                    Цитата
                    Что тебе нужно? Консольное приложение? А почему так критичен размер?


                    Хотел разобраться с консольными приложениями в виндоусе. Что оно будет делать - не важно - общий случай. Первая проблема которая возникла была связана с задержкой. Но с этим вроде разобрались. Процедура 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 УсловиеВыхода
                          Поделюсь одним секретом по сжатию под Win32:
                          1) Упаковываешь exe-шник при помощи UPX (http://upx.sf.net);
                          2) А потом выполняешь "Rebuild PE" в PE-Tools(http://www.uinc.ru).
                          В результате даже весьма приличные приложения (на Free Pascal, например) сжимаются до малых размеров.
                            Всем спасибо за ответы. Уже начал качать Free Pascal.. не нашел его у себя. Попробую там поиграться.

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


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0372 ]   [ 15 queries used ]   [ Generated: 1.12.24, 21:18 GMT ]