<?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=63862&amp;view=findpost&amp;p=442217</guid>
        <pubDate>Thu, 26 Aug 2004 13:55:35 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=442217</link>
        <description><![CDATA[Schwarz: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>Uncle_Bob</strong>, 26.08.04, 15:24<br>
Какие-то мультилоки, винтреды, черт в стуле </div></div><br>
<br>
Да это тестовое задание, сейчас работу ищу. Потому и хотел, чтобы усе сурьезно, солидно и рульно было, на MFC-ых классах. Для себя бы не стал так заморачиваться.]]></description>
        <author>Schwarz</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=442095</guid>
        <pubDate>Thu, 26 Aug 2004 12:24:44 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=442095</link>
        <description><![CDATA[UncleBob: <strong class='tag-b'>Schwarz</strong>, глянь мой пример и сравни со своим... Тебе всего навсего, надо переписать один метод из моего примера, и все заработает :) Какие-то мультилоки, винтреды, черт в стуле  :wacko:]]></description>
        <author>UncleBob</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=442078</guid>
        <pubDate>Thu, 26 Aug 2004 12:11:39 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=442078</link>
        <description><![CDATA[Schwarz: Блин, может я уже зациклился, но ведь должно же так работать.<br>
Один поток - управляющий, который ждет, когда все потоки-шарики сделают по &quot;шагу&quot;(переместятся и нарисуются, выставят event evFinishStep[ID] ), тогда для каждого потока-шарика управляющий поток выставит разрешение сделать очередной &quot;шаг&quot; - event evStart[i]). <br>
Однако как-то &quot;не досинхронизируется&quot; это дело.<br>
И еще - в дебажной версии постоянно вылетает на какой-то UserBreakpoint, что-то c CWinThread. В релизной - работает.<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;</div><div class="code_line">#define NumObj 5</div><div class="code_line">extern CEvent* evFinishStep[NumObj];</div><div class="code_line">extern CEvent* evStart[NumObj];</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp; &nbsp; &nbsp;Рабочая функция потока-шарика</div><div class="code_line">int CObj::Run()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CDC dc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dc.Attach(m_hDC);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CBrush WB(RGB(255,255,255)); &nbsp; &nbsp;//white brush</div><div class="code_line">&nbsp;&nbsp; &nbsp;CBrush CB(RGB(255,0,0)); &nbsp; &nbsp; &nbsp; &nbsp;//color brush</div><div class="code_line">&nbsp;&nbsp; &nbsp;CPen WP(PS_SOLID,1,RGB(255,255,255)); &nbsp; //white pen</div><div class="code_line">&nbsp;&nbsp; &nbsp;CPen CP(PS_SOLID,1,RGB(255,0,0)); &nbsp; &nbsp; &nbsp; //color pen</div><div class="code_line">&nbsp;&nbsp; &nbsp;CBrush *pOldB;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CPen* pOldP; </div><div class="code_line">&nbsp;&nbsp; &nbsp;RECT rw;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pOldB=dc.SelectObject(&amp;WB);</div><div class="code_line">&nbsp;&nbsp; &nbsp;pOldP=dc.SelectObject(&amp;WP);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CSingleLock sl(evStart[this-&#62;m_nID]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(!bDone){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sl.Lock(); &nbsp;//ждать разрешения от ObjMgr</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_pWnd-&#62;GetClientRect(&amp;rw);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CurPosX+=OffsetX;CurPosY+=OffsetY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if((CurPosX+R&#62;=rw.right)||(CurPosX-R&#60;=rw.left)){OffsetX*=-1;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if((CurPosY+R&#62;=rw.bottom)||(CurPosY-R&#60;=rw.top)){OffsetY*=-1;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cs.Lock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.SelectObject(&amp;WB);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.SelectObject(&amp;WP);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.Ellipse(OldPosX-R,OldPosY-R,OldPosX+R,OldPosY+R);//стираем старый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.SelectObject(&amp;CB);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.SelectObject(&amp;CP);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dc.Ellipse(CurPosX-R,CurPosY-R,CurPosX+R,CurPosY+R);//рисуем новый</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GdiFlush();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cs.Unlock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;OldPosX=CurPosX;OldPosY=CurPosY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;evFinishStep[m_nID]-&#62;SetEvent();//сказать, что закончен очередной шаг</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Sleep(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(pOldB)dc.SelectObject(pOldB);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(pOldP)dc.SelectObject(pOldP);</div><div class="code_line">&nbsp;&nbsp; &nbsp;dc.Detach();</div><div class="code_line">&nbsp;&nbsp; &nbsp;return CWinThread::Run();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp; &nbsp; &nbsp;Рабочая функция потока-manager&#39;а</div><div class="code_line">int CObjMgr::Run()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CMultiLock ml((CSyncObject**)evFinishStep,NumObj,0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(1){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ml.Lock(); &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;for(int i=0;i&#60;NumObj;i++){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;evStart[i]-&#62;SetEvent(); &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;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return CWinThread::Run();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp; &nbsp; &nbsp;Запуск всего этого безобразия</div><div class="code_line">void CSW_tmpView::OnTestGo()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;CObj* pObj;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CObj::bDone=false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int x=50,y=50;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CEvent* pEv;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;создать события разрешения работы для</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;потоков-шариков</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(int i=0;i&#60;NumObj;i++){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pEv=new CEvent; &nbsp; &nbsp; //с автосбросом</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pEv-&#62;SetEvent(); &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;evStart[i]=pEv;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;создать события окончания очередного шага перемещения и отрисовки</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;потоков-шариков (для потока-managerа)</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(int i=0;i&#60;NumObj;i++){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pEv=new CEvent; &nbsp; &nbsp; //с автосбросом</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pEv-&#62;ResetEvent(); &nbsp;//изначально поток-manager ждет</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;evFinishStep[i]=pEv;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;создать поток-manager</div><div class="code_line">&nbsp;&nbsp; &nbsp;CObjMgr* pObjMgr=new CObjMgr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pObjMgr-&#62;CreateThread();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;создать потоки-шарики</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(int i=0;i&#60;NumObj;i++){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pObj=new CObj;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pObj-&#62;Init((CWnd*)this,GetDC()-&#62;GetSafeHdc(),x,y+=25);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pObj-&#62;m_nID=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pObj-&#62;CreateThread();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Или это MFC-ные потоки и синхр.объекты такие глючные ?]]></description>
        <author>Schwarz</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=441846</guid>
        <pubDate>Thu, 26 Aug 2004 09:13:06 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=441846</link>
        <description><![CDATA[HOMO_PROGRAMMATIS: Тебе нужно прочитать &quot;как программируют студенты&quot; :))<br>
Что-то в духе<br>
1. Все что может быть закодировано немедленно кодируется<br>
2. Возникают баги,<br>
3. Их пытаются отладить<br>
4. Ничего не получается (<strong class='tag-b'>При этом обязательно упояминается Билл Гейтс</strong>)<br>
5. Все стирается и кодируется заново]]></description>
        <author>HOMO_PROGRAMMATIS</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=441774</guid>
        <pubDate>Thu, 26 Aug 2004 08:19:18 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=441774</link>
        <description><![CDATA[Schwarz: HOMO_PROGRAMMATIS, Uncle_Bob - усе работает, спасибо &#33;<br><br>Похоже что я с CMultiLock&#39;ами перемудрил. Буду разбираться. А то я уже на винды бочку катить начал  :)]]></description>
        <author>Schwarz</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=441039</guid>
        <pubDate>Wed, 25 Aug 2004 13:11:13 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=441039</link>
        <description><![CDATA[UncleBob: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>Schwarz</strong>, 25.08.04, 12:22<br>
Когда выстраиваешь их в вертикальную линию, и запускаешь на перемещение туда-сюда по горизонтали, то разъезжаются они маленько друг относительно друга, особенно когда начинаешь окно мышкой таскать. </div></div><br>
В аттаче - иллюстрация моей идеи (35.3 Кб).<br>
<br>
Разъезжаются может потому, что погрешность в расчетах?]]></description>
        <author>UncleBob</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=440767</guid>
        <pubDate>Wed, 25 Aug 2004 09:47:42 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=440767</link>
        <description><![CDATA[HOMO_PROGRAMMATIS: Так все же, почему не обойтись единственным потоком для всех шариков?<br>
<br>
А вообще... Ну хорошо. Давайте ее решим, просто из спортивного интереса :)<br>
Схема такая: каждый поток ждет своего евента и выполняется один раз. Когда все потоки исполнились, евенты ставятся заново.<br>
Делаем так:<br>
<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;#define NumThreads 32</div><div class="code_line">HANDLE g_GuardEvent;</div><div class="code_line">DWORD g_ThreadActions;</div><div class="code_line">HANDLE g_ThreadEvents[NumThreads]; //Надо динамический? Сделашь сам, это не влияет на суть задачи</div><div class="code_line">&nbsp;</div><div class="code_line">void SetAllEvents()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;g_ThreadActions = 0;</div><div class="code_line">&nbsp;&nbsp;for (int i=0; i &#60; NumThreads; i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetEvent(g_ThreadEvents[i]);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">UINT t_ThreadFn(void* p_Param)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;DWORD l_MyNumber = (DWORD) p_Param;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (;;)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;WaitForSingleObject(g_ThreadEvents[l_MyNumber]);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WaitForSingleObject(g_GuardEvent);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (++g_ThreadActions == NumThreads)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetAllEvents();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetEvent(g_GuardEvent);</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//А тут уже все что вам надо</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void Startup()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (i=0; i &#60; NumThreads; i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;g_ThreadEvents[i] = CreateEvent(NULL, 0, 0, NULL);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;g_GuardEvent = CreateEvent(NULL, 0, 1, NULL);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//Создание всех потоков</div><div class="code_line">&nbsp;&nbsp;for (i=0; i &#60; NumThreads; i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;AfxBeginThread(t_ThreadFn, (void*)i);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//Разрешаем всему этому начать крутиться :)</div><div class="code_line">&nbsp;&nbsp;SetAllEvents();</div><div class="code_line">} </div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='8' style='font-size:8pt;'><strong class='tag-b'>Добавлено в <time class="tag-mergetime" datetime="2004-08-25T09:49:01+00:00">25.08.04, 09:49</time></strong>:</span></span><br>
ЗЫ: писал второпях, наверняка где-нить слегка ляпнул...]]></description>
        <author>HOMO_PROGRAMMATIS</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=440631</guid>
        <pubDate>Wed, 25 Aug 2004 08:22:24 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=440631</link>
        <description><![CDATA[Schwarz: Всем сеньк, особенно Uncle_Bob.<br><br>Не желают шарики синхронно перемещаться, даже с event&#39;ами. Когда выстраиваешь их в вертикальную линию, и запускаешь на перемещение туда-сюда по горизонтали, то разъезжаются они маленько друг относительно друга, особенно когда начинаешь окно мышкой таскать.]]></description>
        <author>Schwarz</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439911</guid>
        <pubDate>Tue, 24 Aug 2004 13:51:03 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439911</link>
        <description><![CDATA[UncleBob: <div class="tag-mod"><div class="tag-mod__prefix">M</div><div class="tag-mod__body"><strong class='tag-b'>Schwarz</strong>, <br>
<br>
Для удобства всех пользователей настоятельно рекомендую пользоваться тегом CODE &#40;<a class='tag-url' href='http&#58;//forum.sources.ru/rules.html' target='_blank'><strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color&#58; red">Правила</span></strong></a> , п.4&#41;</div></div><br>
<br>
В общем, использование потоков здесь, конечно, надуманно. Но выход есть. Создать еще один поток, который знает ID всех шарико-потоков :) Этот вспомогательный поток будет по очереди перебирать ID потоков и посылать им некое сообщение (через PostThreadMessage).<br>
<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">DWORD WINAPI SharikThreadFunc (LPVOID pParam)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;&nbsp;BOOL bRet;</div><div class="code_line">&nbsp;&nbsp;MSG msg;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while ((bRet = GetMessage( &amp;msg, NULL, 0, 0 )) != 0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (bRet == -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// error hndling &amp; exit thread</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;switch (msg)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case WMU_DRAWBALL: // пользовательское</div><div class="code_line">&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;SetEvent (hJobFinished);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// надо ли это?</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
А вот функция вспомогательного потока:<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">DWORD WINAPI HelperThreadFunc (LPVOID pParam)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (i=... ) // для всех шарикопотоков</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Достаем ID потока</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwThreadID = ... [i];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Пошлем i-му потоку сообщение</div><div class="code_line">&nbsp;&nbsp; &nbsp;PostThreadMessage (dwThreadID, WMU_DRAWBALL, 0, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Подождем, пока он его обработает</div><div class="code_line">&nbsp;&nbsp; &nbsp;WaitForSingleObject (hJobFinished, ...)</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Естественно, hJobFinished должен быть создан как autoevent, в исходном невзведенном состоянии.<br>
<br>
И используй WinAPI потоки, что тебе эти MFC Threads сдались? Там такого лешего понакручено, что в повседневной жизни и не требуется :)]]></description>
        <author>UncleBob</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439729</guid>
        <pubDate>Tue, 24 Aug 2004 12:05:36 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439729</link>
        <description><![CDATA[Олег М: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>Guest</strong>, 24.08.04, 17:48<br>
сли не будет синхронизации, то за N-ое количество времени одни потоки могут несколько раз переместить и нарисовать шар (себя), в то время как другие могут вообще ни разу не нарисоваться (не получить управления, разделяемый ресурс - контекст устройства).</div></div><br>
С чего ты взял? Если потоки с одинаковым приоритетом - всё нормально будет, никто ни кого не обгонит.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>Guest</strong>, 24.08.04, 17:48<br>
В функции CBall::Run()(унаследованной от класса CWinThread) примерно так:</div></div><br>
А нафига ты так делаешь - отрисовывай их все в одном потоке.]]></description>
        <author>Олег М</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439712</guid>
        <pubDate>Tue, 24 Aug 2004 11:55:34 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439712</link>
        <description><![CDATA[lesik_28: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>Schwarz</strong>, 24.08.04, 09:31<br>
каждый поток (в CBall::Run()), прежде чем в очередной раз вычислять и рисовать себя, должен дождаться, чтобы все потоки отрисовались в предыдущей итерации.</div></div><br>
<br>
Зачем нужны потоки если шары должны рисоваться последовательно один за другим?]]></description>
        <author>lesik_28</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439703</guid>
        <pubDate>Tue, 24 Aug 2004 11:50:28 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439703</link>
        <description><![CDATA[Schwarz: предыдущий Guest это я.]]></description>
        <author>Schwarz</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439700</guid>
        <pubDate>Tue, 24 Aug 2004 11:48:33 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439700</link>
        <description><![CDATA[Guest: to Олег М, Uncle_Bob<br>
<br>
ТЗ таково, что отрисовка и перемещение (вычисление следующей позиции) шара должны быть в одном потоке для каждого шара (каждый шар - это отдельный поток).<br>
<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">&gt;&gt;Что значит &quot;чтобы шарики не обгоняли друг друга&quot;? </span><br>
Если не будет синхронизации, то за N-ое количество времени одни потоки могут несколько раз переместить и нарисовать шар (себя), в то время как другие могут вообще ни разу не нарисоваться (не получить управления, разделяемый ресурс - контекст устройства).  <br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">&gt;&gt;И что значит &quot;предыдущая итерация&quot;? <br>
&gt;&gt;Ты как их вообще отрисовываешь? </span><br>
В функции CBall::Run()(унаследованной от класса CWinThread) примерно так: <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">CBall::Run()</div><div class="code_line">{</div><div class="code_line">&nbsp;CDC dc;</div><div class="code_line">&nbsp;dc.Attach(m_hDC); </div><div class="code_line">&nbsp;while(!bDone)</div><div class="code_line">&nbsp;{</div><div class="code_line">//////////////////////////////////</div><div class="code_line">//здесь я хотел что-то типа WaitForMultipleObjects(Кол-во_шаров,FinishDrawEvents[],true,INFINITE);</div><div class="code_line">//////////////////////////////////</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;NewPosition.x=...; //вычисление следующей позиции шара</div><div class="code_line">&nbsp;&nbsp;NewPosition.y=...;</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;// блокируем доступ к контексту устройства или</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ожидаем возможность доступа к контексту </div><div class="code_line">&nbsp;&nbsp; &nbsp;// устройства и получив его блокируем доступ </div><div class="code_line">&nbsp;&nbsp; &nbsp;// для других потоков</div><div class="code_line">&nbsp;&nbsp;EnterCriticalSection(&amp;CritSect);</div><div class="code_line">&nbsp;&nbsp;{ </div><div class="code_line">&nbsp;&nbsp;SelectObject(WhiteBrush); </div><div class="code_line">&nbsp;&nbsp;Ellipse(OldPosition); //стираем предыдущую нарисованную позицию шара</div><div class="code_line">&nbsp;&nbsp;SelectObject(ColorBrush);</div><div class="code_line">&nbsp;&nbsp;Ellipse(NewPosition); //рисуем новую позицию</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;LeaveCriticalcalSection(&amp;CritSect);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;OldPosition.x=NewPosition.x; &nbsp;OldPosition.y=NewPosition.y;</div><div class="code_line">//////////////////////////////////</div><div class="code_line">//здесь я хотел что-то типа Event[m_ID].SetEvent;</div><div class="code_line">//////////////////////////////////</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Sleep(20); //даем поработать другим потокам</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;&nbsp;dc.Detach();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//конец потока </div><div class="code_line">}</div></ol></div></div></div></div><br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">&gt;&gt;И нафига тебе евенты? <br>
&gt;&gt;Что с чем ты собираешься синхронизировать? </span><br>
Я хотел синхронизировать потоки друг с другом, чтобы поток, выйдя из Sleep&#39;а гарантированно получил управление только после того, как все потоки (шары) отрисуют себя. <br>
Т.е. в CBall::Run() нарисовали себя, доходим до Sleep - даем поработать другим потокам. Когда выходим из Sleep, нужно чтобы следующее прохождение (итерация) while осуществлялась, только если остальные потоки тоже завершили свою отрисовку. А в таком виде, как сейчас, поток, выйдя из Sleep, может опять получить управление, в то время как другие потоки еще не закончили текущие перемещение и отрисовку, т.е. этот шар будет перемещаться быстрее остальных.<br>
Вот я и хотел ввести для каждого шара Event FinishStep, и в WaitForMultipleObjects(...) дожидаться пока все отрисуют очередной цикл. <br>
Так вот и вопрос, как сделать не массив Event&#39;ов, а что-то типа vector&#39;а, т.к. количество шаров (и Event&#39;ов соответственно) динамически меняется.]]></description>
        <author>Guest</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439578</guid>
        <pubDate>Tue, 24 Aug 2004 10:25:42 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439578</link>
        <description><![CDATA[UncleBob: Не совсем понял зачем тогда потоки... Ели они отрисовываются последовательно. Мобыть примитивный таймер решает?]]></description>
        <author>UncleBob</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439564</guid>
        <pubDate>Tue, 24 Aug 2004 10:11:02 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439564</link>
        <description><![CDATA[Олег М: Что-то не очень понятно что нужно сделать. <br>Что значит &quot;чтобы шарики не обгоняли друг друга&quot;? <br>И что значит &quot;предыдущая итерация&quot;? <br>Ты как их вообще отрисовываешь? <br>И нафига тебе евенты? <br>Что с чем ты собираешься синхронизировать?]]></description>
        <author>Олег М</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439518</guid>
        <pubDate>Tue, 24 Aug 2004 09:31:50 +0000</pubDate>
        <title>Синхронизация потоков (MFC)</title>
        <link>https://forum.sources.ru/index.php?showtopic=63862&amp;view=findpost&amp;p=439518</link>
        <description><![CDATA[Schwarz: Суть задачи. Рисуем, например, летающие шарики в одном окне, каждый шарик - отдельный поток (CBall : public CWinThread), в котором вычисляется положение шарика и рисуется сам шарик. <br>Задача синхронизировать потоки (чтобы шарики не обгоняли друг друга), т.е. каждый поток (в CBall::Run()), прежде чем в очередной раз вычислять и рисовать себя, должен дождаться, чтобы все потоки отрисовались в предыдущей итерации. Шарики будут в list&lt;CBall*&gt;. Шары можно динамически добавлять/удалять прямо во время работы.<br>Необходимо использование Event&#39;ов (на каждый шар - Event окончания отрисовки), но ::WaitForMultipleObjects() или CMultiLock работают только с массивами Event&#39;ов, c vector&#39;ами или list&#39;ами - нет. Делать массив - некрасиво (в программе все на STL), т.к количество шаров(потоков) динамически меняется.<br>Можно что-нить придумать ?]]></description>
        <author>Schwarz</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      </channel>
      </rss>
	