<?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=352382&amp;view=findpost&amp;p=3091327</guid>
        <pubDate>Tue, 06 Mar 2012 06:25:51 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3091327</link>
        <description><![CDATA[Dem_max: мы не ищем легких путей  :facepalm:]]></description>
        <author>Dem_max</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3091288</guid>
        <pubDate>Tue, 06 Mar 2012 04:43:39 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3091288</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3090050'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>gpepsi &#064; <time class="tag-quote__quoted-time" datetime="2012-03-04T09:26:24+00:00">04.03.12, 09:26</time></span><div class='quote '>пробовал все варианты<br>
...<br>
и т.д.</div></div><br>
Метод ненаучного тыка? ;) И что значит &quot;и.т.д.&quot;, где нужный вариант типа 15,0,100?]]></description>
        <author>leo</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3090197</guid>
        <pubDate>Sun, 04 Mar 2012 13:51:24 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3090197</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Процессор загрузил на 100%</div></div><br>
Что есть свидетельство неправильного алгоритма работы программы.]]></description>
        <author>Prince</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3090050</guid>
        <pubDate>Sun, 04 Mar 2012 09:26:24 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3090050</link>
        <description><![CDATA[gpepsi: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3090046'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2012-03-04T09:21:57+00:00">04.03.12, 09:21</time></span><div class='quote '>Ну, а если не заморачиваться с MAXDWORD-фишками, и просто установить Multiplier=0, а Constant и Interval в нужные тебе значения? Constant будет ограничивать общее время ожидания, а Interval - выход при наличии задержки в поступлении данных </div></div><br>
пробовал все варианты<br>
1. MAXDWORD, MAXDWORD, 100, 0, 1000<br>
2. MAXDWORD, 0, 100, 0, 1000<br>
3. MAXDWORD, 0, 0, 0, 1000<br>
4. 0, 0, 100, 0, 1000<br>
5. 0, 0, 0, 0, 1000<br>
и т.д.<br>
<br>
В чем проблема я понял когда выставил 0, 0, 0<br>
Процессор загрузил на 100%, но при этом данные пошли.<br>
Как и сказано в документации при этом управление передается сразу сколько бы данных не было.]]></description>
        <author>gpepsi</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3090046</guid>
        <pubDate>Sun, 04 Mar 2012 09:21:57 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3090046</link>
        <description><![CDATA[leo: <strong class='tag-b'>gpepsi</strong><br>
Ну, а если не заморачиваться с MAXDWORD-фишками, и просто установить Multiplier=0, а Constant и Interval в нужные тебе значения? Constant будет ограничивать общее время ожидания, а Interval - выход при наличии задержки в поступлении данных]]></description>
        <author>leo</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089927</guid>
        <pubDate>Sun, 04 Mar 2012 02:00:12 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089927</link>
        <description><![CDATA[Dem_max: Ну примерно так код не весь<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">int ReadCommBlock( HWND hWnd, LPSTR lpszBlock, int nMaxLength)</div><div class="code_line">{</div><div class="code_line">COMSTAT &nbsp; &nbsp;ComStat;</div><div class="code_line">DWORD &nbsp; &nbsp; &nbsp;dwErrorFlags;</div><div class="code_line">DWORD &nbsp; &nbsp; &nbsp;dwLength;</div><div class="code_line">BOOL &nbsp; &nbsp; &nbsp; fReadStat;</div><div class="code_line">&nbsp;</div><div class="code_line">// получили количесиво байт в буффере</div><div class="code_line">ClearCommError(g_hComDev, &amp;dwErrorFlags, &amp;ComStat);</div><div class="code_line">&nbsp;</div><div class="code_line">// Если в буфере меньше байт чем мы запрнашиваем на считывание, то</div><div class="code_line">// считаем весь буффер, иначе считаем запрашиваемое количество байт &nbsp;</div><div class="code_line">dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (dwLength &#62; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fReadStat = ReadFile(g_hComDev, lpszBlock,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwLength, &amp;dwLength, &amp;g_Overlapped) ;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Dem_max</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089750</guid>
        <pubDate>Sat, 03 Mar 2012 20:51:53 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089750</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Сложилось у меня такое представление, опытным путём. <br>
 Что ты примешь этот байт когда истечёт тайм-аут.<br>
<br>
 И что байты принимаются порциями, равными или кратными<br>
 размеру фифо. Если число принятых байт меньше размера фифо,<br>
 получишь их после истечения тайм-аута.</div></div><br>
Какой именно таймаут истечёт? О каком таймауте речь? :scratch: <br>
И что будет, когда фифо заполнится, а таймаут(какой-то) не истечёт? И как эту ситуацию предотвратить? :scratch:<br>
<br>
Мыслю так. Если установить размер фифо в 1 байт, по идее, винда будет считывать в свой буфер один байт сразу после его приёма, если успеет. <br>
Но ладно, пусть размер фифо будет 8 байт. Допустим, принят 1 байт(а таймаут UARTa равен длительности передачи 8 байт). При скорости 9600 бод,  интервал между завершением приёма байта и  запросом на прерывание будет около 10 мс (?). При скоростях обмена бОльших, задержка будет меньше. Т.е., задержка в обработке уже_фактически_принятого_байта, будет зависеть не cтолько от таймаута железа, сколько от скорости работы самой винды(пока будет обработано прерывание, пока приложение получит управление, пока истекут таймауты, установленные для readfile...). Я правильно мыслю?]]></description>
        <author>Prince</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089609</guid>
        <pubDate>Sat, 03 Mar 2012 19:41:37 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089609</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089201'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T22:52:24+00:00">02.03.12, 22:52</time></span><div class='quote '>Допустим, размер FIFO UART  - килобайт, а нужно принять 1 байт, и этот байт уже принят и лежит в буфере, что означает в данном случае &quot;принять по таймауту&quot;?</div></div><br>
Сложилось у меня такое представление, опытным путём. <br>
 Что ты примешь этот байт когда истечёт тайм-аут.<br>
<br>
 И что байты принимаются порциями, равными или кратными<br>
 размеру фифо. Если число принятых байт меньше размера фифо,<br>
 получишь их после истечения тайм-аута.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089241</guid>
        <pubDate>Sat, 03 Mar 2012 07:00:37 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089241</link>
        <description><![CDATA[Dem_max: <div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><br>
Следующей важной управляющей структурой является COMMTIMEOUTS. Она определяет параметры временных задержек при приеме и передаче. Значения, задаваемые полями этой структуры, оказывают большое влияние на работу функций чтения/записи. <br>
<br>
<br>
<br>
<br>
<br>
 typedef struct _COMMTIMEOUTS {<br>
 DWORD ReadIntervalTimeout;<br>
 DWORD ReadTotalTimeoutMultiplier;<br>
 DWORD ReadTotalTimeoutConstant;<br>
 DWORD WriteTotalTimeoutMultiplier;<br>
 DWORD WriteTotalTimeoutConstant;<br>
 } COMMTIMEOUTS,*LPCOMMTIMEOUTS;<br>
<br>
<br>
<br>
<br>
 Поля структуры COMMTIMEOUTS имеют следующие значения: <br>
 ReadIntervalTimeout<br>
      <br>
 Максимальное время, в миллисекундах, допустимое между двумя последовательными символами считываемыми с коммуникационной линии. Во время операции чтения временной период начинает отсчитываться с момента приема первого символа. Если интервал между двумя последовательными символами превысит заданое значение, операция чтения завершается и все данные, накопленые в буфере, передаются в программу. Нулевое значение данного поля означает, что данный тайм-аут не используется. Значение MAXDWORD, вместе с нулевыми значениями полей ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier, означает немедленный возврат из операции чтения с передачей уже принятого символа, даже если ни одного символа не было получено из линии. <br>
  <br>
 ReadTotalTimeoutMultiplier<br>
  <br>
 Задает множитель, в миллисекундах, используемый для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение умножается на количество запрошеных для чтения символов. <br>
  <br>
 ReadTotalTimeoutConstant<br>
  <br>
 Задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение прибавляется к результату умножения ReadTotalTimeoutMultiplier на количество запрошеных для чтения символов. Нулевое значение полей ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant означает, что общий тайм-аут для операции чтения не используется. <br>
  <br>
 WriteTotalTimeoutMultiplier<br>
  <br>
 Задает множитель, в миллисекундах, используемый для вычисления общего тайм-аута операции записи. Для каждой операции записи данное значение умножается на количество записываемых символов. <br>
  <br>
 WriteTotalTimeoutConstant<br>
  <br>
 Задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции записи. Для каждой операции записи данное значение прибавляется к результату умножения WriteTotalTimeoutMultiplier на количество записываемых символов. Нулевое значение полей WriteTotalTimeoutMultiplier и WriteTotalTimeoutConstant означает, что общий тайм-аут для операции записи не используется. <br>
 По тайм-аутам обычно возникает много вопросов. Поэтому попробую объяснить подробнее. Пусть мы считываем 50 символов из порта со скоростью 9600. При этом используется 8 бит на символ, дополнение до четности и один стоповый бит. Таким образом на один символ в физической линии приходится 11 бит (включая стартовый бит). 50 символов на скорости 9600 будут приниматься 50 * 11 / 9600 = 0.0572916 секунд, или примерно 57.3 миллисекунды, при условии нулевого интервала между приемом последовательных символов. Если интервал между символами составляет примерно половину времени передачи одного символа, т.е. 0.5 миллисекунд, то время приема будет 50 * 11 / 9600 + 49 * 0.0005 = 0.0817916 секунд, или примерно 82 миллисекунды. Если в процессе чтения прошло более 82 миллисекунд, то мы вправе предположить, что произошла ошибка в работе внешнего устройства и прекратить считывание избежав тем самым зависания программы. Это и есть общий тайм-аут операции чтения. Аналогично существует и общий там-аут операции записи. <br>
 Если тайм-аут при чтении понятен, то тайм-аут при записи вызывает недоумение. В самом деле, что нам мешает передавать? Управление потоком&#33; Внешнее устройство может использовать, например, аппаратное управление потоком. При этом пропадание питания во внешнем устройстве заставит компьютер приостановить передачу данных. Если не контролировать тайм-аут возможно точно такое же зависание компьютера, как и при операции чтения. <br>
 Общий тайм-аут зависит от количества участвующих в операции чтения/записи символов и среднего времени передачи одного символа с учетом межсимвольного интервала. Если символов много, например 1000, то на общем времени выполнения операции начинают сказываться колебания времени затрачиваемого на один символ или времени межсимвольного интервала. Поэтому тайм-ауты в структуре COMMTIMEOUTS задаются двумя величинами. Таким образом формула для вычисления общего тайм-аута операции, например чтения, выглядит так NumOfChar * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant, где NumOfChar это число символов запрошеных для операции чтения. <br>
 Для операции чтения, кроме общего тайм-аута на всю операцию, задается так же тайм-аут на интервал между двумя последовательными символами. Точнее это интервал между началами двух последовательных символов. В это значение входит и время передачи самого символа. <br>
 Теперь небольшой пример. ReadTotalTimeoutMultiplier = 2, ReadTotalTimeoutConstant = 1, ReadIntervalTimeout = 1, считывается 250 символов. Если операция чтения завершится за 250 * 2 + 1 = 501 миллисекунду, то будет считано все сообщение. Если операция чтения не завершится за 501 миллисекунду, то она все равно будет завершена. При этом будут возвращены символы, прием которых завершился до истечения тайм-аута операции. Остальные символы могут быть получены следеющей операцией чтения. Если между началами двух последовательных символов пройдет более 1 миллисекунды, то операция чтения так же будет завершена. <br>
 Надеюсь, что теперь тайм-ауты не будут вызывать у Вас затруднений. Для завершения темы тайм-аутов рассмотрим один частный случай. Если поля ReadIntervalTimeout и ReadTotalTimeoutMultiplier установлены в MAXDWORD, а ReadTotalTimeoutConstant больше нуля и меньше MAXDWORD, то выполнение оперции чтения подчиняется следующим правилам: <br>
 Если в буфере есть символы, то чтение немедленно завершается и возвращается символ из буфера; <br>
 Если в буфере нет символов, то операция чтения будет ожидать появления любого символа, после чего она немедленно завершится; <br>
 Если в течении времени, заданого полем ReadTotalTimeoutConstant, не будет принято ни одного символа, оперция чтения завершится по тайм-ауту. <br>
 Помните функцию BuildCommDCB? Существует еще функция BuildCommDCBAndTimeouts, которая позволяет заполнить не только структуру DCB, но и структуру COMMTIMEOUTS.<br>
</div></div><br>
<br>
<a class='tag-url' href='http://www.realcoding.net/article/view/2416' target='_blank'>http://www.realcoding.net/article/view/2416</a>]]></description>
        <author>Dem_max</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089236</guid>
        <pubDate>Sat, 03 Mar 2012 06:21:59 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089236</link>
        <description><![CDATA[Prince: Килобайт - для ровного счёта, неважно. Вот что означает &quot;можно принять только по таймауту&quot;? :unsure:]]></description>
        <author>Prince</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089214</guid>
        <pubDate>Sat, 03 Mar 2012 03:47:23 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089214</link>
        <description><![CDATA[Qraizer: Ну, килобайт - это ты загнул. Как я понимаю, это вот это:<br>
<span class="b-attach" data-size="16587" data-hits="755" data-attach-id="16532" data-attach-post-id="3089214">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3089214&amp;attach_id=16532' title='Скачать файл' target='_blank'>__________.PNG</a> (, : 755)
		</span>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089201</guid>
        <pubDate>Fri, 02 Mar 2012 22:52:24 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089201</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>когда количество полученных байт меньше, чем размер FIFO UART, то принять их можно только по тайм-ауту</div></div><br>
Это как это? :wacko: Переведи... :wacko: Допустим, размер FIFO UART  - килобайт, а нужно принять 1 байт, и этот байт уже принят и лежит в буфере, что означает в данном случае &quot;принять по таймауту&quot;?]]></description>
        <author>Prince</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089194</guid>
        <pubDate>Fri, 02 Mar 2012 21:54:10 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089194</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3088878'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>gpepsi &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T12:55:32+00:00">02.03.12, 12:55</time></span><div class='quote '>Так вот если в процессе ожидания приходят данные, то управление возвращается не сразу, а выжидается ReadTotalTimeoutConstant.<br>
В результате чего резко падает скорость.</div></div><br>
Попробуй поставить 10 [мс].<br>
 Кроме того, всё ещё сложнее.<br>
 Результаты приёма зависят от заданного размера FIFO UART-а.<br>
 <br>
 Если мне не изменяет память, в случае когда количество полученных<br>
 байт меньше, чем размер FIFO UART, то принять их можно только по тайм-ауту.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089088</guid>
        <pubDate>Fri, 02 Mar 2012 17:59:06 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089088</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089062'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T17:26:08+00:00">02.03.12, 17:26</time></span><div class='quote '>Прав в чём?</div></div>Вот это:<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089023'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T16:39:59+00:00">02.03.12, 16:39</time></span><div class='quote '>этот текст следует читать как &quot;мы ПЛАНИРОВАЛИ, что функция работать будет вот так, но потом сделали немного иначе&quot;.</div></div>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089063</guid>
        <pubDate>Fri, 02 Mar 2012 17:26:45 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089063</link>
        <description><![CDATA[gpepsi: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089040'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T16:57:26+00:00">02.03.12, 16:57</time></span><div class='quote '>Я имею в виду GetCommProperties</div></div><br>
не вызывал <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-02T17:28:10+00:00">02.03.12, 17:28</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089062'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T17:26:08+00:00">02.03.12, 17:26</time></span><div class='quote '>а инфа из справки, видимо, отражает первоначальные планы разработчиков. Вот почему не исправят, или реализацию функции или описание - загадка.</div></div><br>
пока я это понял - просидел под PortMon-ом 3 дня :(]]></description>
        <author>gpepsi</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089062</guid>
        <pubDate>Fri, 02 Mar 2012 17:26:08 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089062</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Prince, ты прав. Когда я писал нечто подобное для Win9x, то асинхронность в итоге пришлось делать руками. Управление таймаутами в виде отдельных параметров порта и специальной функции их установки в контенсте асинхронного обмена произвольного рамера сообщениями неудобны, гораздо удобнее управлять ими при каждом вызове ReadFile().</div></div><br>
Прав в чём? Я имел в виду синхронный режим. &quot;Нормально&quot;, что readfile ожидает ReadTotalTimeoutConstant при ReadIntervalTimeout = ReadTotalTimeoutMultiplier = MAXDWORD - так она и работает, а инфа из справки, видимо, отражает первоначальные планы разработчиков. Вот почему не исправят: или реализацию функции, или описание - загадка. :unsure:  <br>
О неудобствах таймаутов &quot;в принципе&quot; -  не могу судить. Зависит от протокола обмена с девайсом.]]></description>
        <author>Prince</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089040</guid>
        <pubDate>Fri, 02 Mar 2012 16:57:26 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089040</link>
        <description><![CDATA[Qraizer: Тебе можно ждать одного символа без таймаута, и если он-таки есть, дочитывать остальное, если же нет, самому выждать 1000 мс, оформив это ожидание как самому удобнее. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-02T16:57:57+00:00">02.03.12, 16:57</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089038'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>gpepsi &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T16:56:48+00:00">02.03.12, 16:56</time></span><div class='quote '>Это при каких настройках ?</div></div>ReadIntervalTimeout = ReadTotalTimeoutMultiplier = MAXDWORD, а ReadTotalTimeoutConstant = 1000 <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-02T17:07:53+00:00">02.03.12, 17:07</time></span></span><br>
<strong class='tag-b'>Prince</strong>, ты прав. Когда я писал нечто подобное для Win9x, то асинхронность в итоге пришлось делать руками. Управление таймаутами в виде отдельных параметров порта и специальной функции их установки в контенсте асинхронного обмена произвольного рамера сообщениями неудобны, гораздо удобнее управлять ими при каждом вызове ReadFile(). Я тогда написал свою функцию CommReadFile() и управлял логикой задержек изунтри неё посредством Sleep(). Наверное они там подумали, что иметь аж пять дополнительных параметров для функции чтения - причём требовалась уже не ReadFile(), там параметры размещать уже негде - это ещё больший маразм, а скорости COMов таковы, что оверхед железа перекрывает оверхед от частых SetCommTimeouts().<br>
<br>
P.S. Несмотря на уверения, что OVERLAPPED под Win9X для COM реализовано, оно не работало. Или работало не так, как описано, и я не понял, как именно. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2012-03-02T17:13:37+00:00">02.03.12, 17:13</time></span></span><br>
Кстати, <strong class='tag-b'>gpepsi</strong>, а настройки самого порта каковы? Я имею в виду GetCommProperties(). Тормозить исполнение может ещё и драйвер, не отдавая в юзермод данные, пока их не накопится.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089038</guid>
        <pubDate>Fri, 02 Mar 2012 16:56:48 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089038</link>
        <description><![CDATA[gpepsi: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089037'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T16:54:50+00:00">02.03.12, 16:54</time></span><div class='quote '>онкретно в своей ситуации: функция вернёт всё что есть на момент её вызова, если очередь непуста; в противном случае будет ждать в течении ReadTotalTimeoutConstant, то завершается в любом случае, вернув &quot;всё что есть&quot;, т.е. в частном случае ничего. </div></div><br>
не понял. Это при каких настройках ?]]></description>
        <author>gpepsi</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089037</guid>
        <pubDate>Fri, 02 Mar 2012 16:54:50 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089037</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089008'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>gpepsi &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T16:04:58+00:00">02.03.12, 16:04</time></span><div class='quote '>Но хотелось бы все-таки разобраться с таймаутами... </div></div>Конкретно в своей ситуации: функция вернёт всё что есть на момент её вызова, если очередь непуста; в противном случае будет безусловно ждать в течении ReadTotalTimeoutConstant, а затем завершится в любом случае, вернув по окончании ожидания &quot;всё что есть&quot;, т.е. в частном случае ничего.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089023</guid>
        <pubDate>Fri, 02 Mar 2012 16:39:59 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089023</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Если прикладная программа устанавливает...<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Так вот если в процессе ожидания приходят данные, то управление возвращается не сразу, а выжидается ReadTotalTimeoutConstant.</div></div></div></div><br>
Скорее всего, этот текст следует читать как &quot;мы ПЛАНИРОВАЛИ, что функция работать будет <em class='tag-i'>вот так</em>, но потом сделали немного иначе&quot;. :yes: <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Никак не могу настроить таймауты.<br>
З.Ы. Мне нужно сразу получать данные.<br>
Решил проблему ассинхронным чтением с ожиданием EV_RXCHAR.<br>
Но хотелось бы все-таки разобраться с таймаутами... </div></div><br>
Информации о протоколе обмена с устройством недостаточно. Если устройство передаёт данные, когда ему вздумается, а не в ответ на запрос - асинхронное чтение с ожиданием EV_RXCHAR хороший вариант.]]></description>
        <author>Prince</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089008</guid>
        <pubDate>Fri, 02 Mar 2012 16:04:58 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089008</link>
        <description><![CDATA[gpepsi: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=352382&view=findpost&p=3089000'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2012-03-02T15:53:40+00:00">02.03.12, 15:53</time></span><div class='quote '>У тебя несколько противоречивые желания. Сам подумай: если ничего нет, то подождать 1000 мс; если есть, то вернуть имеющееся без ожидания. Внимание вопрос: что делать, если ничего нет, но через 200 мс пришёл один символ? Вернуть этот самый один, который &quot;всё что есть&quot;, или ждать дальше, мол, а вдруг счас ещё парочка набежит? </div></div><br>
ну если пришел один, то придут и следующие. такой протокол<br>
<br>
Решил проблему ассинхронным чтением с ожиданием EV_RXCHAR.<br>
Жду когда придет хоть один а потом читаю все что есть.<br>
В результате получается чтение блоками различной длины.<br>
<br>
Но хотелось бы все-таки разобраться с таймаутами...]]></description>
        <author>gpepsi</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089000</guid>
        <pubDate>Fri, 02 Mar 2012 15:53:40 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3089000</link>
        <description><![CDATA[Qraizer: У тебя несколько противоречивые желания. Сам подумай: если ничего нет, то подождать 1000 мс; если есть, то вернуть имеющееся без ожидания. Внимание вопрос: что делать, если ничего нет, но через 200 мс пришёл один символ? Вернуть этот самый один, который &quot;всё что есть&quot;, или ждать дальше, мол, а вдруг счас ещё парочка набежит?]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3088878</guid>
        <pubDate>Fri, 02 Mar 2012 12:55:32 +0000</pubDate>
        <title>SetCommTimeouts</title>
        <link>https://forum.sources.ru/index.php?showtopic=352382&amp;view=findpost&amp;p=3088878</link>
        <description><![CDATA[gpepsi: Никак не могу настроить таймауты.<br>
В документации сказано<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Если прикладная программа устанавливает члены структуры  ReadIntervalTimeout и  ReadTotalTimeoutMultiplier в MAXDWORD,  а член стуктуры  ReadTotalTimeoutConstant<br>
устанавливается в значение больше чем нуль и меньше, чем MAXDWORD, когда  вызывается функция ReadFile, происходит одно из ниже перечисленного:<br>
  1. Если есть какие-либо символы в буфере ввода данных,  ReadFile немедленно возвращает значение с символами в буфере.<br>
  2. Если в буфере ввода данных нет никаких символов,  ReadFile ждет до тех пор, пока не поступит символ, а затем немедленно возвращает значение.<br>
  3. Если в пределах времени, заданного членом ReadTotalTimeoutConstant,  никакого символа не поступает,  ReadFile прерывает работу.<br>
</div></div><br>
<br>
То есть если есть хоть какие-то данные, то управление возвращается сразу.<br>
У меня ReadIntervalTimeout = ReadTotalTimeoutMultiplier = MAXDWORD, а ReadTotalTimeoutConstant = 1000<br>
<br>
Так вот если в процессе ожидания приходят данные, то управление возвращается не сразу, а выжидается ReadTotalTimeoutConstant.<br>
В результате чего резко падает скорость.<br>
<br>
Почему так ? Может еще что задать нужно помимо таймаутов ?<br>
<br>
З.Ы. Мне нужно сразу получать данные. Есть все задать нулями, то тогда будет синхронное чтение всего запрашиваемого буфера.<br>
А мне нужно получать то, что есть.]]></description>
        <author>gpepsi</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      </channel>
      </rss>
	