<?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=134207&amp;view=findpost&amp;p=1034840</guid>
        <pubDate>Sun, 05 Mar 2006 20:21:55 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1034840</link>
        <description><![CDATA[Coffee: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034034'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sploid &#064; <time class="tag-quote__quoted-time" datetime="2006-03-05T00:18:31+03:00">04.03.06, 21:18</time></span><div class='quote '>надо выкладывать не код, а солюшен, что бы не трахаться с созданием нового проекта, удалением оттуда файлов, вставкой новых.<br>
</div></div><br>
Как я уже писал у меня компилятор - BCB 6.0 какие в нем солюшены - я не знаю. И так весь VCL убрал дабы совместимость была, и консоль - по тойже причине.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034034'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sploid &#064; <time class="tag-quote__quoted-time" datetime="2006-03-04T21:18:31+00:00">04.03.06, 21:18</time></span><div class='quote '><br>
т.к. порт открыт как оверлапед, то<br>
Цитата 	<br>
if (&#33;ReadFile(hPort, Buf, dwRead, &amp;dwRead, &amp;OverRead))<br>
        {<br>
        cout&lt;&lt;&quot;&#092;n&#092;nError reading port&#092;n&#092;n&quot;; Error(); exit(1);<br>
        }<br>
если не считалось то нормально и нужно ждать события OverRead.hEvent ( когда считается), а не выходить с ошибкой.<br>
</div></div><br>
Кстати, валится именно на этом... Может я не так как-то делаю... Сделал так:<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">if (!ReadFile(hPort, Buf, dwRead, &amp;dwRead, &amp;OverRead))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WaitForSingleObject(OverRead.hEvent, INFINITE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ....</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Теперь вечно висит на WaitForSingleObject ... мда короче. Разбираться еще и разбираться...<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034034'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sploid &#064; <time class="tag-quote__quoted-time" datetime="2006-03-04T21:18:31+00:00">04.03.06, 21:18</time></span><div class='quote '><br>
в чем проблема, почему не работает на другом компе?</div></div><br>
Работаем удаленно - другой комп в другом городе. Сказать 100% точно - не могу. Но 99,9% проблема в том что вышеописанная конструкция - корявая, как впрочем видимо и все остальное. :( <br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034309'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Ace &#064; <time class="tag-quote__quoted-time" datetime="2006-03-05T10:42:08+00:00">05.03.06, 10:42</time></span><div class='quote '>if (&#33;WriteFile(hPort, temp, sizeof(temp),&amp;dwWrite, &amp;OverWrite))<br>
<br>
Размер указателя? Ты уверен что так правильно?  <br>
</div></div><br>
Косяк, спасибо, учтем.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034309'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Ace &#064; <time class="tag-quote__quoted-time" datetime="2006-03-05T10:42:08+00:00">05.03.06, 10:42</time></span><div class='quote '><br>
OverRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);<br>
...<br>
WaitForSingleObject(OverRead.hEvent, INFINITE);<br>
<br>
У тебя эвент с мануальным сбросом, но, что-то не где не видно чтоб ты его сбрасывал...<br>
</div></div><br>
Да честно говоря - х.з. смотрел в МСДНе исходники их. Вроде тоже нигде не сбрасывают. А может и сбрасывают, там такое наворочено, что черт ногу сломит.  :wall: Буду еще смотреть.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034309'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Ace &#064; <time class="tag-quote__quoted-time" datetime="2006-03-05T10:42:08+00:00">05.03.06, 10:42</time></span><div class='quote '><br>
char Buf[100]=&quot;&quot;;<br>
...<br>
dwRead = ComStat.cbInQue;<br>
...<br>
if (&#33;ReadFile(hPort, Buf, dwRead, &amp;dwRead, &amp;OverRead))<br>
<br>
А не ты разве простраивал буффер в 256? Шанс схлопотать исключение не велик, но если схлопочешь - мало не покажется...<br>
</div></div><br>
Самое малое из моих зол...  ;)  :D  :lool: <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1034309'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Ace &#064; <time class="tag-quote__quoted-time" datetime="2006-03-05T10:42:08+00:00">05.03.06, 10:42</time></span><div class='quote '><br>
BuildCommDCB(&quot;baud=9600 parity=N data=8 stop=1&quot;,dcb);<br>
А остальные настройки у ваших компов одинаковые?</div></div><br>
<br>
Да вроде бы да. При таких же параметрах HyperTerminal пашет ...<br>
<br>
В общем тему пока закрывать не буду. Попробую еще с исходниками с МСДНа разобраться. Если поставить  эти параметры туда, их прога - катит. На этом можно было бы и остановиться, но меня бесят две вещи - уровень собственного понимания этой проблемы (над этим надо работать...) и весь тот зоопарк с ресурсами, критическими секциями, десятью отдельными *.с файлами в проекте и прочей мишурой из МСДН сурсов...  &gt;:(  Короче работы по горло. <br>
Всем большое спасибо что откликнулись - буду искать дальше.  :)]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1034309</guid>
        <pubDate>Sun, 05 Mar 2006 10:42:08 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1034309</link>
        <description><![CDATA[Ace: <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">if (!WriteFile(hPort, temp, sizeof(temp),&amp;dwWrite, &amp;OverWrite))</div></ol></div></div></div></div><br>
Размер указателя? Ты уверен что так правильно?  ;) <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">OverRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</div><div class="code_line">...</div><div class="code_line">WaitForSingleObject(OverRead.hEvent, INFINITE);</div></ol></div></div></div></div><br>
У тебя эвент с мануальным сбросом, но, что-то не где не видно чтоб ты его сбрасывал...<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">char Buf[100]=&quot;&quot;;</div><div class="code_line">...</div><div class="code_line">dwRead = ComStat.cbInQue;</div><div class="code_line">...</div><div class="code_line">if (!ReadFile(hPort, Buf, dwRead, &amp;dwRead, &amp;OverRead))</div></ol></div></div></div></div><br>
А не ты разве простраивал буффер в 256? Шанс схлопотать исключение не велик, но если схлопочешь - мало не покажется...<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">BuildCommDCB(&quot;baud=9600 parity=N data=8 stop=1&quot;,dcb);</div></ol></div></div></div></div><br>
А остальные настройки у ваших компов одинаковые?]]></description>
        <author>Ace</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1034034</guid>
        <pubDate>Sat, 04 Mar 2006 21:18:31 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1034034</link>
        <description><![CDATA[sploid: надо выкладывать не код, а солюшен, что бы не трахаться с созданием нового проекта, удалением оттуда файлов, вставкой новых.<br>
<br>
т.к. порт открыт как оверлапед, то<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><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">if (!ReadFile(hPort, Buf, dwRead, &amp;dwRead, &amp;OverRead))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cout&#60;&#60;&quot;\n\nError reading port\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
</div></div><br>
если не считалось то нормально и нужно ждать события OverRead.hEvent ( когда считается), а не выходить с ошибкой.<br>
<br>
в чем проблема, почему не работает на другом компе?]]></description>
        <author>sploid</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1033796</guid>
        <pubDate>Sat, 04 Mar 2006 16:07:35 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1033796</link>
        <description><![CDATA[Coffee: И снова приветствую всех&#33;<br>
Есть большая просьба - у кого есть модем внутренний или внешний или подобное оборудование - проверьте пожалуйста, будет ли у вас работать этот код. У меня PCI модем на COM3 у товарища - обычный модем на СОМ2. У меня все прекрасно работает - у него - нет. Понять причину немогу.<br>
Если кто подскажет в чем дело - буду очень признателен.<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">#include &#60;windows.h&#62;</div><div class="code_line">#include &#60;conio.h&#62;</div><div class="code_line">#include &#60;iostream.h&#62;</div><div class="code_line">#define MAX 1024</div><div class="code_line">&nbsp;</div><div class="code_line">DWORD WINAPI ThreadFunc(LPVOID lpParam );</div><div class="code_line">void Error(void);</div><div class="code_line">bool Terminate=TRUE;</div><div class="code_line">HANDLE hPort = NULL;</div><div class="code_line">char *temp;</div><div class="code_line">&nbsp;</div><div class="code_line">void main(void)</div><div class="code_line">{</div><div class="code_line">//Запрашивам имя порта</div><div class="code_line">clrscr();</div><div class="code_line">temp=(char*)calloc(MAX,sizeof(char));</div><div class="code_line">strcpy(temp,&quot;\n\nВведите номер открываемого порта, например COM1 или COM3\n\n&quot;);</div><div class="code_line">CharToOem((const char*)temp,(char*)temp);</div><div class="code_line">cout&#60;&#60;temp;</div><div class="code_line">memset(temp, &#39;{text}&#39;,MAX);</div><div class="code_line">cin&#62;&#62;temp;</div><div class="code_line">&nbsp;</div><div class="code_line">//открываем порт</div><div class="code_line">hPort=CreateFile(temp,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GENERIC_WRITE|GENERIC_READ,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OPEN_EXISTING,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILE_FLAG_OVERLAPPED,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL);</div><div class="code_line">if(hPort!=INVALID_HANDLE_VALUE){</div><div class="code_line">&nbsp;&nbsp; cout&#60;&#60;&quot;\nOpenPort - ok\n&quot;;}</div><div class="code_line">&nbsp;&nbsp; else{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Error();getch();exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">//проводим настройку порта </div><div class="code_line">DCB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*dcb;</div><div class="code_line">COMMTIMEOUTS &nbsp;ct;</div><div class="code_line">&nbsp;</div><div class="code_line">//скорости, четности, битность битов, стоп биты...</div><div class="code_line">dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));</div><div class="code_line">dcb-&#62;DCBlength=sizeof(DCB);</div><div class="code_line">BuildCommDCB(&quot;baud=9600 parity=N data=8 stop=1&quot;,dcb);</div><div class="code_line">dcb-&#62;fNull=TRUE;</div><div class="code_line">&nbsp;</div><div class="code_line">//таймауты порта</div><div class="code_line">ct.ReadIntervalTimeout=10;</div><div class="code_line">ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;</div><div class="code_line">ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;</div><div class="code_line">&nbsp;</div><div class="code_line">SetCommState(hPort,dcb);</div><div class="code_line">SetCommTimeouts(hPort,&amp;ct);</div><div class="code_line">&nbsp;</div><div class="code_line">//очистка порта перед работой очищаем все что можно</div><div class="code_line">PurgeComm(hPort,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);</div><div class="code_line">SetupComm(hPort,256,256); //последние два параметра - длина вх.\ вых. буфера</div><div class="code_line">SetCommMask(hPort,EV_RXCHAR); //маска ожидания символа во входном буфере</div><div class="code_line">&nbsp;</div><div class="code_line">//Запускаем поток на чтение порта</div><div class="code_line">&nbsp;</div><div class="code_line">DWORD lpThreadId;</div><div class="code_line">HANDLE hThread = CreateThread(</div><div class="code_line">&nbsp;&nbsp; &nbsp;(LPSECURITY_ATTRIBUTES) NULL, &nbsp; // pointer to thread security attributes</div><div class="code_line">&nbsp;&nbsp; &nbsp;(DWORD) 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// initial thread stack size, in bytes</div><div class="code_line">&nbsp;&nbsp; &nbsp;(LPTHREAD_START_ROUTINE) &amp;ThreadFunc, &nbsp;// pointer to thread function</div><div class="code_line">&nbsp;&nbsp; &nbsp;(LPVOID) &amp;hPort, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // argument for new thread</div><div class="code_line">&nbsp;&nbsp; &nbsp;(DWORD) 0, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// creation flags</div><div class="code_line">&nbsp;&nbsp; &nbsp;(LPDWORD) &amp;lpThreadId &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // pointer to returned thread identifier</div><div class="code_line">&nbsp;&nbsp; );</div><div class="code_line">&nbsp;</div><div class="code_line">//Работаем с пользователем</div><div class="code_line">for(;Terminate==TRUE;)</div><div class="code_line">{</div><div class="code_line">strcpy(temp,&quot;\n\nВведите команду, например ATI1-ATI7 или ATZ\nВыход - восклицательный знак &#39;!&#39;\n&quot;);</div><div class="code_line">CharToOem((const char*)temp,(char*)temp);</div><div class="code_line">cout&#60;&#60;temp;</div><div class="code_line">memset(temp, &#39;{text}&#39;,MAX);</div><div class="code_line">cin&#62;&#62;temp;</div><div class="code_line">&nbsp;</div><div class="code_line">if(strcmp(temp,&quot;!&quot;)==0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;TerminateThread(hThread,1);</div><div class="code_line">&nbsp;&nbsp;clrscr();</div><div class="code_line">&nbsp;&nbsp;cout&#60;&#60;&quot;\nBye!\n&quot;;</div><div class="code_line">&nbsp;&nbsp;exit(0);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">DWORD dwWrite ;</div><div class="code_line">OVERLAPPED OverWrite;</div><div class="code_line">strcat(temp,&quot;\r\n&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">OverWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</div><div class="code_line">if (OverWrite.hEvent == NULL)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; cout&#60;&#60;&quot;\n\nError creating write event\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">if (!WriteFile(hPort, temp, sizeof(temp),&amp;dwWrite, &amp;OverWrite))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(GetLastError() != ERROR_IO_PENDING)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cout&#60;&#60;&quot;\n\nError writing port\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout&#60;&#60;&quot;\n\nWrited to port\n&quot;&#60;&#60;temp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">//getch(); &nbsp; &nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">getch();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">DWORD WINAPI ThreadFunc(LPVOID lpParam )</div><div class="code_line">{</div><div class="code_line">Terminate=TRUE;</div><div class="code_line">HANDLE hPort=*(HANDLE*)lpParam;</div><div class="code_line">COMSTAT ComStat;</div><div class="code_line">DWORD dwMask, dwError, dwRead;</div><div class="code_line">OVERLAPPED OverRead;</div><div class="code_line">char Buf[100]=&quot;&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">OverRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</div><div class="code_line">if (OverRead.hEvent == NULL)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; cout&#60;&#60;&quot;\n\nError creating read event\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">while (Terminate)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!WaitCommEvent(hPort, &amp;dwMask,(LPOVERLAPPED)&amp;OverRead))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (GetLastError() == ERROR_IO_PENDING){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WaitForSingleObject(OverRead.hEvent, INFINITE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout&#60;&#60;&quot;\n\nError waiting port event\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!ClearCommError(hPort, &amp;dwError, &amp;ComStat))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cout&#60;&#60;&quot;\n\nError clearing port\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwRead = ComStat.cbInQue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(dwRead &#62; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (!ReadFile(hPort, Buf, dwRead, &amp;dwRead, &amp;OverRead))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cout&#60;&#60;&quot;\n\nError reading port\n\n&quot;; Error(); exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; // В Buf находятся прочитанные байты</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; // идет обработка принятых байтов ...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cout&#60;&#60;&quot;\n\n*****************************\n&quot;&#60;&#60;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &quot;DATA_FROM_PORT:\n&quot;&#60;&#60;(char*)Buf&#60;&#60;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;\n*****************************\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; memset(Buf, &#39;{text}&#39;, strlen(Buf) - 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void Error(void)</div><div class="code_line">{</div><div class="code_line">LPVOID lpMsgBuf;</div><div class="code_line">FormatMessage(</div><div class="code_line">&nbsp;&nbsp; &nbsp;FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,</div><div class="code_line">&nbsp;&nbsp; &nbsp;NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetLastError(),</div><div class="code_line">&nbsp;&nbsp; &nbsp;MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(LPTSTR) &amp;lpMsgBuf,</div><div class="code_line">&nbsp;&nbsp; &nbsp;0,</div><div class="code_line">&nbsp;&nbsp; &nbsp;NULL);</div><div class="code_line">CharToOem((const char*)lpMsgBuf,(char*)lpMsgBuf);</div><div class="code_line">cout&#60;&#60;&quot;\n\nGetLastError:\n\n&quot;&#60;&#60;(const char*)lpMsgBuf&#60;&#60;&quot;\n\n&quot;;</div><div class="code_line">LocalFree( lpMsgBuf );</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030729</guid>
        <pubDate>Wed, 01 Mar 2006 16:40:15 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030729</link>
        <description><![CDATA[Coffee: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1030538'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Паровоз &#064; <time class="tag-quote__quoted-time" datetime="2006-03-01T13:29:28+00:00">01.03.06, 13:29</time></span><div class='quote '>Слушай, а может тебе проверить провода на счет замыкания 2и3 пина. Если они замкнуты, то и ответы будут такими странными. И еще вариант, то, что оборудование такое.</div></div><br>
2 <strong class='tag-b'>exodus</strong> все понятно, OVERLAPPED forever :)<br>
2 <strong class='tag-b'>Паровоз</strong> нет, там стоит PCI модем на котором я и извращаюсь, когда получится с ним перейду на другое оборудование. Да и не может быть так, что одни и те же команды работают асинхронно и не работают синхронно. ИМХО - либо кривая прога - либо виндовый механизм синхронного I/O в ХР...]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030538</guid>
        <pubDate>Wed, 01 Mar 2006 13:29:28 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030538</link>
        <description><![CDATA[Паровоз: Слушай, а может тебе проверить провода на счет замыкания 2и3 пина. Если они замкнуты, то и ответы будут такими странными. И еще вариант, то, что оборудование такое.]]></description>
        <author>Паровоз</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030507</guid>
        <pubDate>Wed, 01 Mar 2006 13:11:08 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030507</link>
        <description><![CDATA[exodus: <strong class='tag-b'>Coffee</strong>, в MSDN написано, что синхронно читать/писать можно, но реалии таковы, то это дело работает только на Win95-98, а на линейке NT5 (2k, XP, 2003) не пашет, про NT4 и ранее не в курсе - не пробовал, так что про синхронную работу - забудь. У меня правда получается работать синхронно с WaitCommEvent, при том, что дескриптор порта открыт с флагом OVERLAPPED, но в доке написано, что такой режим не рекомендуется. <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="2006-03-01T13:13:41+00:00">01.03.06, 13:13</time></span></span><br>
Собственно вот тема, где обсуждается блокировка при синхронном в/в: <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=127181' target='_blank'>[COM-порт]синхронная запись/мониторинг</a>]]></description>
        <author>exodus</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030354</guid>
        <pubDate>Wed, 01 Mar 2006 11:14:26 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030354</link>
        <description><![CDATA[Coffee: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1030128'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Adil &#064; <time class="tag-quote__quoted-time" datetime="2006-03-01T08:48:24+00:00">01.03.06, 08:48</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1029987'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Паровоз &#064; <time class="tag-quote__quoted-time" datetime="2006-03-01T06:44:53+00:00">01.03.06, 06:44</time></span><div class='quote '>Асинхронно порт работает только в 98windows, NT/XP вроде только синхронный.</div></div>Чушь <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="2006-03-01T08:50:28+00:00">01.03.06, 08:50</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1029744'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Coffee &#064; <time class="tag-quote__quoted-time" datetime="2006-02-28T19:25:49+00:00">28.02.06, 19:25</time></span><div class='quote '>Посылаешь ему команду (любую) - во входном буфере ловишь ее имя и все. Никакого тебе ответа от оборудования. Когда делал асинхронно - все было иначе.</div></div><br>
Странная и непонятная фраза: что значит &quot;ловить имя команды&quot;? Какой ответ от какого оборудования?</div></div><br>
2 <strong class='tag-b'>Паровоз</strong><br>
&quot;ReadFile не вернет управления, пока не заполнит буфер либо не возникнет сбой/таймаут.&quot; - верно, он буфер пока не заполнит, он не вернет, но он чем-то не тем его заполняет... и BC&gt;0 тут не катит... чтобы понять что я имею ввиду см. мой ответ <strong class='tag-b'>Adil</strong>&#39;у<br>
<br>
2 <strong class='tag-b'>Adil</strong><br>
Поясню что это значит. <br>
1. Асинхронный вариант<br>
Посылаю команду ATZ получаю ответ от оборудования - что-то типа &quot;ATZ&#092;r&#092;n&#092;r&#092;nOK&#092;r&#092;n&quot; во входном буфере.<br>
Посылаю команду ATH1 получаю ответ от оборудования - что-то типа &quot;&#092;r&#092;nOK&#092;r&#092;n&quot; во входном буфере и характерный звук модема.<br>
<br>
1. Синхронный вариант (исходник см.выше)<br>
Посылаю команду ATZ получаю во входном буфере &quot;ATZ&quot;.<br>
Посылаю команду ATH1 получаю во входном буфере &quot;ATH1&quot; и <strong class='tag-b'>никакого</strong> звука от модема.<br>
<br>
<br>
2 <strong class='tag-b'>exodus</strong><br>
В одном потоке помоему точно не стоит ;)<br>
Так тот исходник что я кинул будет работать под ХР? или под 2000/ХР синхронная запись/чтение - в моем случае не покатят? Непонимаю...  :wall:  в мсдн вроде написано мол и то можно и то, только примеры лежат под OVERLAPPED вариант...]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030203</guid>
        <pubDate>Wed, 01 Mar 2006 09:31:02 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030203</link>
        <description><![CDATA[exodus: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1030128'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Adil &#064; <time class="tag-quote__quoted-time" datetime="2006-03-01T08:48:24+00:00">01.03.06, 08:48</time></span><div class='quote '>Чушь</div></div><br>
К сожалению, не чушь - сам недавно напоролся на эту фигню.  Недавно эту проблему уже обсуждали на форуме.<br>
При попытке записать синхронно в порт, тред, который пишет, - блокируется, пока не разблокируется тред, в котором данные из порта синхронно читаются.<br>
Т.е. пока используется либо только синхронное чтение, либо только синхронная запись - всё ОК, совместно они друг друга блочат.<br>
<br>
Пришлось переходить к псевдо-синхронной схеме, т.е. использовать асинхронные вызовы ReadFile/WriteFile, а потом ожидать сигнализации события о завершении операции. <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="2006-03-01T09:38:30+00:00">01.03.06, 09:38</time></span></span><br>
<strong class='tag-b'>Coffee</strong>, при таком количестве портов, возможно, имеет смысл не плодить кучу тредов, а создать пул тредов, каждый из которых будет обрабатывать несколько портов. В таком случае, после запуска операции асинхронно, тебе надо будет, например, с помощью GetOverlappedResult пробегаться по списку ивентов, связанных с операциями по каждому порту. Теоритически, можно рискнуть это сделать в одном треде (но у меня есть ощущение, что не будет успевать).<br>
<br>
В UNIXах c этим проще - select умеет работать не только с сокетами, но и с дескрипторами обычных файлов и устройств, а в Windows данная возможность не реализована.]]></description>
        <author>exodus</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030128</guid>
        <pubDate>Wed, 01 Mar 2006 08:48:24 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1030128</link>
        <description><![CDATA[Adil: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1029987'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Паровоз &#064; <time class="tag-quote__quoted-time" datetime="2006-03-01T06:44:53+00:00">01.03.06, 06:44</time></span><div class='quote '>Асинхронно порт работает только в 98windows, NT/XP вроде только синхронный.</div></div>Чушь <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="2006-03-01T08:50:28+00:00">01.03.06, 08:50</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=134207&view=findpost&p=1029744'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Coffee &#064; <time class="tag-quote__quoted-time" datetime="2006-02-28T19:25:49+00:00">28.02.06, 19:25</time></span><div class='quote '>Посылаешь ему команду (любую) - во входном буфере ловишь ее имя и все. Никакого тебе ответа от оборудования. Когда делал асинхронно - все было иначе.</div></div><br>
Странная и непонятная фраза: что значит &quot;ловить имя команды&quot;? Какой ответ от какого оборудования?]]></description>
        <author>Adil</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1029987</guid>
        <pubDate>Wed, 01 Mar 2006 06:44:53 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1029987</link>
        <description><![CDATA[Паровоз: Используй вместо своей конструкции<br> WaitCommEvent(hPort,&amp;mask,NULL);<br> ReadFile(hPort,buf_in,strlen(buf_out),&amp;bc,NULL);<br>Вот эту<br> if( ReadFile(hPort, buf_in, strlen(buf_out), &amp;bc, 0)){<br>  if (bc &gt; 0){/*что то делаем*/}<br> }<br>ReadFile не вернет управления, пока не заполнит буфер либо не возникнет сбой/таймаут. Совсем необязательно, что буфер будет заполнен, нужно проверять, что bc&gt;0. Асинхронно порт работает только в 98windows, NT/XP вроде только синхронный.]]></description>
        <author>Паровоз</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1029744</guid>
        <pubDate>Tue, 28 Feb 2006 19:25:49 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1029744</link>
        <description><![CDATA[Coffee: Спасибо всем еще раз, возник такoй вопрос:<br>
Обрисую ситуацию - порядка 30-50 портов, на каждый порт свой поток, пока я данные в порт не отправил и не получил ответ от устройства - делать потоку собственно нечего т.е. дальнейшее выполнение целиком зависит от результатов предыдущих шагов(как я понимаю основная фишка асинхронного метода в продолжении работы потока не заботясь о завершении записи/считывания информации).<br>
В моем случае есть ли какой-либо смысл использовать асинхронный I/O?<br>
Или проще(и проще ли?) использовать в каждом потоке синхронный метод?<br>
<br>
И еще одно :) Порылся поиском по сайту, накопал много доков по портам, в одном из них нашел пример, но вот чего я понять не могу(я все-таки пока далеко не эксперт по портам ;) ) - так это почему он так странно работает? Посылаешь ему команду (любую) - во входном буфере ловишь ее имя и все. Никакого тебе ответа от оборудования. Когда делал асинхронно - все было иначе. Вот пример...<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
#include &lt;windows.h&gt;<br>
#include &lt;iostream.h&gt;<br>
#include &lt;conio.h&gt;<br>
<br>
void main(void)<br>
{<br>
   DCB           dcb;<br>
   COMMTIMEOUTS  ct;<br>
   HANDLE        hPort;<br>
   DWORD         bc;<br>
   DWORD         mask;<br>
<br>
   char         *buf_out=&quot;ATI3&quot;;<br>
   char         *buf_in;<br>
<br>
   dcb.DCBlength=sizeof(DCB);<br>
   BuildCommDCB(&quot;baud=9600 parity=N data=8 stop=1&quot;,&amp;dcb);<br>
   dcb.fNull=TRUE;<br>
<br>
   ct.ReadIntervalTimeout=10;<br>
   ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;<br>
   ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;<br>
<br>
   hPort=CreateFile(&quot;COM3&quot;,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);<br>
   if(hPort==INVALID_HANDLE_VALUE) {<br>
      MessageBox(NULL,&quot;Невозможно открыть последовательный порт&quot;,&quot;Error&quot;,MB_OK);<br>
      ExitProcess(1);<br>
   }<br>
<br>
   SetCommState(hPort,&amp;dcb);<br>
   SetCommTimeouts(hPort,&amp;ct);<br>
   PurgeComm(hPort,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);<br>
   SetupComm(hPort,256,256);<br>
<br>
   SetCommMask(hPort,EV_RXCHAR);<br>
<br>
   buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1);<br>
   cout&lt;&lt;&quot;&#092;nWRITTE&#092;t&quot;&lt;&lt;buf_out;<br>
   WriteFile(hPort,buf_out,strlen(buf_out),&amp;bc,NULL);<br>
   WaitCommEvent(hPort,&amp;mask,NULL);<br>
   ReadFile(hPort,buf_in,strlen(buf_out),&amp;bc,NULL);<br>
   cout&lt;&lt;&quot;&#092;nREAD&#092;t&quot;&lt;&lt;buf_in;<br>
<br>
   HeapFree(GetProcessHeap(),0,buf_in);<br>
   CloseHandle(hPort);<br>
   getch();<br>
}<br>
</div></div>]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027922</guid>
        <pubDate>Mon, 27 Feb 2006 10:14:51 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027922</link>
        <description><![CDATA[exodus: <strong class='tag-b'>sploid</strong>, это у тебя для ожидания WaitCommEvent сделано, а для чтения нет, тем более, что можно завершение потока по-другому реализовать, например вручную сигнализировать ивент или просто прибить тред.]]></description>
        <author>exodus</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027905</guid>
        <pubDate>Mon, 27 Feb 2006 09:58:40 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027905</link>
        <description><![CDATA[sploid: флаг bWait выставляется в фальс, когда надо завершить поток чтения, т.е. когда случится событие pSiem-&gt;m_hEventEndThread.]]></description>
        <author>sploid</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027839</guid>
        <pubDate>Mon, 27 Feb 2006 08:34:25 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027839</link>
        <description><![CDATA[exodus: <strong class='tag-b'>sploid</strong>, я бы чуток упростил программу, учитывая, что ожидание завершения OVERLAPPED-операции может делать сам GetOverlappedResult с флагом bWait = TRUE.]]></description>
        <author>exodus</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027747</guid>
        <pubDate>Mon, 27 Feb 2006 06:31:46 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027747</link>
        <description><![CDATA[Паровоз: Используй ReadFile в отдельных потоках, проверено, работает надежно. Дело в том, что приведенный выше пример немного медленней работает и при высокой скорости работы порта может пропускать байты, вернее буфер порта переполняется и байты теряются.]]></description>
        <author>Паровоз</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027683</guid>
        <pubDate>Mon, 27 Feb 2006 00:56:11 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027683</link>
        <description><![CDATA[Coffee: Спасибо, буду пока разбираться, помоему, то что нужно&#33;  :yes:]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027631</guid>
        <pubDate>Sun, 26 Feb 2006 22:12:49 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027631</link>
        <description><![CDATA[sploid: вот пример из моей проги, может будет полезен. Когда данных для чтения нет, то поток чтения просто ждет когда появятся данные, а не проверяет постоянно очередь.<br>
инициализация ком порта<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">&nbsp;&nbsp; &nbsp;char &nbsp;strNamePort[ 150 ] = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp;sprintf( strNamePort, &quot;COM%d:&quot;, nComPort );</div><div class="code_line">&nbsp;&nbsp; &nbsp;m_hComPort = CreateFile( strNamePort,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GENERIC_READ | GENERIC_WRITE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;OPEN_EXISTING,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;NULL );</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;if ( SetCommMask( m_hComPort, EV_RXCHAR ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;COMMTIMEOUTS &nbsp; TimeOuts;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( GetCommTimeouts( m_hComPort, &amp;TimeOuts ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TimeOuts.ReadIntervalTimeout &nbsp; &nbsp; &nbsp; &nbsp; = 40;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TimeOuts.ReadTotalTimeoutMultiplier &nbsp;= 0; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TimeOuts.ReadTotalTimeoutConstant &nbsp; &nbsp;= 0; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TimeOuts.WriteTotalTimeoutMultiplier = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TimeOuts.WriteTotalTimeoutConstant &nbsp; = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( SetCommTimeouts( m_hComPort, &amp;TimeOuts ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div></ol></div></div></div></div><br>
функция чтение крутиться в цикле в отдельном потоке, вот кусок.<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">// pSiem-&#62;m_hComPort - хэндл ком порта</div><div class="code_line">// pSiem-&#62;m_hEventEndThread - событие что надо закончить поток чтения.</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD &nbsp; nBytesRead = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool bFlag = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while ( bFlag )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// если тут, значит все ок и данные записали, читаем ответ</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp; dwCommEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp; dwOvRes = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ивент события ком порта</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;OVERLAPPED &nbsp;osStatus = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;osStatus.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( osStatus.hEvent == NULL )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TRACE( &quot;ERROR: ивет для события ком порта не создался!\n&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( !WaitCommEvent( pSiem-&#62;m_hComPort, &amp;dwCommEvent, &amp;osStatus ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( GetLastError( ) == ERROR_IO_PENDING )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// все ок, ждем события</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle( osStatus.hEvent );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char message[ 200 ] = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sprintf( message, &quot;ERROR: WaitCommEvent failed, error = %d!\n&quot;, GetLastError( ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TRACE( message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// плохо, не понятная ошибка</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle( osStatus.hEvent );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char message[ 200 ] = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sprintf( message, &quot;ERROR: WaitCommEvent failed, error = %d!\n&quot;, GetLastError( ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TRACE( message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ожидаем события не чтение или закрываем поток на чтение</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;HANDLE hEv[ 2 ];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hEv[ 0 ] = pSiem-&#62;m_hEventEndThread;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hEv[ 1 ] = osStatus.hEvent;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD dwRes = WaitForMultipleObjects( 2, hEv, FALSE, INFINITE );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;switch( dwRes )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case WAIT_OBJECT_0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bFlag = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// завершаем поток</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case WAIT_OBJECT_0 + 1:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( !GetOverlappedResult( pSiem-&#62;m_hComPort, &amp;osStatus, &amp;dwOvRes, FALSE ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// плохо, не понятная ошибка</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle( osStatus.hEvent );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char message[ 200 ] = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sprintf( message, &quot;ERROR: GetOverlappedResult failed, error = %d!\n&quot;, GetLastError( ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TRACE( message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle( osStatus.hEvent );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ивент чтения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OVERLAPPED &nbsp;osRead = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( osRead.hEvent == NULL )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TRACE( &quot;ERROR: инет для чтения не создался!\n&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;COMSTAT &nbsp; &nbsp; Comstatus;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp; dwError;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ClearCommError( pSiem-&#62;m_hComPort, &amp;dwError, &amp;Comstatus );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char * buffer = new char [ Comstatus.cbInQue + 1 ];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memset( buffer, 0, Comstatus.cbInQue + 1 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( !ReadFile( pSiem-&#62;m_hComPort, buffer, Comstatus.cbInQue, &amp;nBytesRead, &amp;osRead ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD dwLastError = GetLastError( );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if( dwLastError != ERROR_IO_PENDING )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ошибка чтения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle( osRead.hEvent );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char message[ 200 ] = { 0 };</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sprintf( message, &quot;ERROR: ReadFile failed, error = %d!\n&quot;, dwLastError );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TRACE( message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD fRes = WaitForSingleObject( osRead.hEvent, INFINITE );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch ( fRes )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case WAIT_OBJECT_0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( !GetOverlappedResult( pSiem-&#62;m_hComPort, &amp;osRead, &amp;nBytesRead, FALSE))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</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;// ошибка чтения</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;CloseHandle( osRead.hEvent );</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;char message[ 200 ] = { 0 };</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;sprintf( message, &quot;ERROR: GetOverlappedResult failed, error = %d!\n&quot;, GetLastError( ) );</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;TRACE( message );</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;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</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;// All ok.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</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;// ошибка чтения</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;CloseHandle( osRead.hEvent );</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;char message[ 200 ] = { 0 };</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;sprintf( message, &quot;ERROR: Хрен знает что за ошибка, error = %d!\n&quot;, GetLastError( ) );</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;TRACE( message );</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;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// All ok.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
в конце по идее в переменной buffer  будет прочитанные символы<br>
что непонятно спрашивайте.]]></description>
        <author>sploid</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027559</guid>
        <pubDate>Sun, 26 Feb 2006 20:24:02 +0000</pubDate>
        <title>Оптимизация асинхронного I/O в COM порт</title>
        <link>https://forum.sources.ru/index.php?showtopic=134207&amp;view=findpost&amp;p=1027559</link>
        <description><![CDATA[Coffee: Доброго времени суток, уважаемые&#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">Платформа WIN32, ОС ХР, комилятор BCB 6.xx</div></ol></div></div></div></div><br>
Собственно в чем вопрос - проблема в том, что в потоке в цикле висит алгоритм который проверяет WaitCommEvent(), ERROR_IO_PENDING, наличие данных в очереди - ComStat.cbInQue ну и так далее, и все такое. Все замечательно, все работает, но очень уж беспокоит то, что загрузка ЦП очень высока. Пока обрабатывается один порт одним потоком, все вроде бы и ничего, но в реальности будет обрабатываться много (примерно 30~50) портов, я так полагю, ситуация значительно ухудшится. :( <br>
Этому есть разумное решение программным способом? ;)]]></description>
        <author>Coffee</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      </channel>
      </rss>
	