Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Сообщ.
#1
,
|
|
|
Столкнулся с такой проблемой: мне нужно что бы моя программа (паскаль, но под виндоус) ждала какого-то события. Долго искал.. все, что смог найти сводится к:
procedure Pause( p : longint ); var T : longint; begin T := ReadTimer + p; repeat until T <= ReadTimer; end; ну или через GetTickCount - не важно.. Во всем этом нужно делать бесконечный цикл, а это очень сильно сказывается на процессоре. Т.е. когда это программа под Дос - это не важно, а вот если под виндоус - виндоус начинает жутко тормозить, пока моя программа обрабатывает цикл repeat until [что-то там].. Как с этим можно справиться? По идее, программа должна передать управление виндоусу на Х миллисекунд.. Но как это сделать? З.Ы. Пробовал SetTimer, но не получилось с ним толком разобраться. То что у меня получилось сводилось к тому же - программа должна что-то "делать" пока не запустится процедура из SetTimer'а |
Сообщ.
#2
,
|
|
|
Хм. Когда ты пишешь программы под Windows, система сама разберется, как и кому передавать управление. А специального средства передать упреавление Windows используя фактически средства DOS, не существует
|
Сообщ.
#3
,
|
|
|
обычно ДОСовые события передаются через глобальные переменные, например так:
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 она может и быть актуальной. |
Сообщ.
#4
,
|
|
|
Цитата Eiden @ 28.06.04, 01:39 Хм. Когда ты пишешь программы под Windows, система сама разберется, как и кому передавать управление. Система-то разбирается.. но вопрос на сколько каряво? к примеру если в цикле изменить на: 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 кб.. |
Сообщ.
#5
,
|
|
|
Не знаю как в BP7, но в Delphi и Free Pascal функция sleep() (как и многие другие функции WinAPI) находятся в модуле winsows:
uses windows; А еще что-то припоминаю про функцию delay() в модуле CRT... |
Сообщ.
#6
,
|
|
|
Trustmaster, crt'шный делэй вообще-то безнадежно устарел и годен только на генерацию рантайм-ерроров
Цитата *Max*, 28.06.04, 13:47 Виндоус почти не тормозит от моей программы в 10 кб.. то есть все равно тормозит? Кхм... Попробуй поставь цикл типа repeat Yield; until kakoe_to_message; |
Сообщ.
#7
,
|
|
|
Цитата то есть все равно тормозит? Кхм... Попробуй поставь цикл типа repeat Yield; until kakoe_to_message; Так и делаю.. 2 all Посоветуйте на чем лучше писать - должно получиться КОМПАКТНОЕ приложение.. Делфи не подходит по определению.. 15 Бк пустого консоль приложение не катит. Пытался вот писать на Паскале под виндоус - меня убило что там нету встроенного отладчика + глюки с подключение модулей - в хелпе толком ничего нету, а угадать самому в какой модуле находится та или другая функция - не реально. Начал уже читать Си.. все супер - а приложение все равно компилируются очень большими.. 45-50 бк просто вывод текста.. ЗЫ На асм перереходить не очень хочется.. геморойно это все-таки.. :/ |
Сообщ.
#8
,
|
|
|
Хм. Раздел не про C, но все же.
Если там все правильно сделать, то размеры будут и меньше. Что тебе нужно? Консольное приложение? А почему так критичен размер? |
Сообщ.
#9
,
|
|
|
Цитата Что тебе нужно? Консольное приложение? А почему так критичен размер? Хотел разобраться с консольными приложениями в виндоусе. Что оно будет делать - не важно - общий случай. Первая проблема которая возникла была связана с задержкой. Но с этим вроде разобрались. Процедура Yield дает не плохой результат. Далее встал вопрос с размере. Все таки разница в размере дос приложения и виндоус в 50 раз - довольно существенно. Вот начал интересоваться.. Возможно это настройки компилятора, возможно просто старая версия компилятора (хотя я сильно сомневаюсь что в новой размер экзешника будет меньше, скорее наоборот).. может еще что-то.. Вот поэтому и спрашиваю.. Добавлено в : Может можно как-то использовать исключительно модули виндоуса, не подключая в экзешник "родные" паскаля\си? Это должно резко сократить код. Добавлено в : Кстати форум не реагирует на разницу в часовых поясах: Сообщ. #9 сегодня, 17:08 - явно "серверное" время Через 2 минуты я дополняю: Добавлено в 16:10 - "мое" время |
Сообщ.
#10
,
|
|
|
*Max*,
как тебе сказал уже Trustmaster, подключи модуль Windows, и используй Sleep() [Free Pascal / TMT] А если хочешь получить маленький размер ЕХЕ файла, пиши на Ассемблере (тогда тебе в другой раздел). Но, по-моему, излишня такая придирчивость к размеру приложения, она не оправдана. Добавлено в : Также можно упаковать ехешник такими пакерами, как UPX, ASPack, ... Если это сильно критично. Но тогда это ОТДЕЛЬНАЯ тема для обсуждения! |
Сообщ.
#11
,
|
|
|
Цитата Не надо...Vesper, 29.06.04, 10:04 Trustmaster, crt'шный делэй вообще-то безнадежно устарел и годен только на генерацию рантайм-ерроров http://pascal.sources.ru/cgi-bin/show.cgi?...oming&id=newcrt По поводу темы... repeat asm mov ax,1680h int 2Fh end until УсловиеВыхода |
Сообщ.
#12
,
|
|
|
Поделюсь одним секретом по сжатию под Win32:
1) Упаковываешь exe-шник при помощи UPX (http://upx.sf.net); 2) А потом выполняешь "Rebuild PE" в PE-Tools(http://www.uinc.ru). В результате даже весьма приличные приложения (на Free Pascal, например) сжимаются до малых размеров. |
Сообщ.
#13
,
|
|
|
Всем спасибо за ответы. Уже начал качать Free Pascal.. не нашел его у себя. Попробую там поиграться.
А тему о размере файлов думаю нужно будет поднять (если ее не подняли до меня конечно ).. Все таки это не дело.. Да, я не спорю - бывают ситуации когда можно спокойно писать на Делфи и не парить мозги тем, что у тебя пустая форма компилируется в 400 Бк.. Но иногда это явно не подходит. |