<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=89440&amp;view=findpost&amp;p=667121</guid>
        <pubDate>Fri, 01 Apr 2005 14:34:30 +0000</pubDate>
        <title>Таймер в консольной программе</title>
        <link>https://forum.sources.ru/index.php?showtopic=89440&amp;view=findpost&amp;p=667121</link>
        <description><![CDATA[Jin X:  <br>
<div class='tag-align-center'><span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>Использование таймера в консольной программе</strong></span></span></div><br>
Использование WinAPI-функции <strong class='tag-b'>SetTimer</strong> не обязательно требует наличия окна. Можно просто указать адрес процедуры, а затем запустить цикл <strong class='tag-b'>GetMessage</strong>. Чтобы завершить работу приложения, необходимо послать ему сообщение <strong class='tag-b'>WM_QUIT</strong>. Как видите, всё элементарно, и говорить здесь больше не о чем :)<br>
<br>
Хотите пример? Пожалуйста&#33;<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">; ml /c /coff /Ic:\masm32\include contimer.asm</div><div class="code_line">; link /subsystem:console /libpath:c:\masm32\lib contimer.obj</div><div class="code_line">&nbsp;</div><div class="code_line">.586P</div><div class="code_line">.MODEL Flat,StdCall</div><div class="code_line">OPTION CASEMAP:NONE</div><div class="code_line">&nbsp;</div><div class="code_line">INCLUDE &nbsp; &nbsp; WINDOWS.INC</div><div class="code_line">INCLUDE &nbsp; &nbsp; KERNEL32.INC</div><div class="code_line">INCLUDE &nbsp; &nbsp; USER32.INC</div><div class="code_line">INCLUDELIB &nbsp;KERNEL32.LIB</div><div class="code_line">INCLUDELIB &nbsp;USER32.LIB</div><div class="code_line">&nbsp;</div><div class="code_line">.DATA</div><div class="code_line">&nbsp;</div><div class="code_line">String &nbsp; &nbsp; &nbsp;db &nbsp;&#39;.&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Строка для вывода</div><div class="code_line">Counter &nbsp; &nbsp; db &nbsp;10 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Счётчик (кол-во запусков TimerProc)</div><div class="code_line">lpMsg &nbsp; &nbsp; &nbsp; MSG &#60;&#62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Буфер для сообщения</div><div class="code_line">TimerID &nbsp; &nbsp; dd &nbsp;? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Идентификатор таймера</div><div class="code_line">hConOut &nbsp; &nbsp; dd &nbsp;? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Дескриптор стандартного вывода</div><div class="code_line">Result &nbsp; &nbsp; &nbsp;dd &nbsp;? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Кол-во записанных байт через WriteConsole</div><div class="code_line">&nbsp;</div><div class="code_line">.CODE</div><div class="code_line">&nbsp;</div><div class="code_line">; Процедура, запускаемая по таймеру</div><div class="code_line">TimerProc &nbsp; proc &nbsp; &nbsp;hWnd, uMsg, idEvent, dwTime: DWORD</div><div class="code_line">; Выводим в стандартный вывод строку</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;WriteConsole, hConOut, addr String, sizeof String, addr Result, NULL</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec Counter &nbsp; &nbsp; &nbsp; &nbsp;; Уменьшаем счётчик</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz @@NoKill</div><div class="code_line">; Если счётчик = 0, то удаляем таймер и посылаем WM_QUIT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;KillTimer, NULL, TimerID</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;PostQuitMessage</div><div class="code_line">@@NoKill: &nbsp; ret &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Выходим из процедуры</div><div class="code_line">TimerProc &nbsp; endp</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">;----------------------------------------------------------------------------;</div><div class="code_line">; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Начало основной программы &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;</div><div class="code_line">;----------------------------------------------------------------------------;</div><div class="code_line">&nbsp;</div><div class="code_line">Start:</div><div class="code_line">&nbsp;</div><div class="code_line">; Получаем дескриптор стандартного вывода и сохраняем его</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;GetStdHandle, STD_OUTPUT_HANDLE</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov hConOut, eax</div><div class="code_line">; Устанавливаем таймер</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SetTimer, NULL, 0, 200, addr TimerProc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov TimerID,eax</div><div class="code_line">@@Repeat:</div><div class="code_line">; Запускаем цикл GetMessage</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;GetMessage, addr lpMsg, NULL, 0, 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;or &nbsp;eax,eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;@@Exit &nbsp; &nbsp; &nbsp; &nbsp; ; Выходим из цикла, если получено WM_QUIT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;TranslateMessage, addr lpMsg</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;DispatchMessage, addr lpMsg</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jmp @@Repeat</div><div class="code_line">@@Exit:</div><div class="code_line">; Выходим из программы</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;ExitProcess, NULL</div><div class="code_line">&nbsp;</div><div class="code_line">END &nbsp; &nbsp; Start</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Jin X</author>
        <category>Assembler FAQ</category>
      </item>
	
      </channel>
      </rss>
	