<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[TThread , WaitForMultipleObjects , EAccessViolation]]></title><description><![CDATA[<p>Hi</p>
<p>Ich habe in der Execute-Methode eines Threads die WaitForMultipleObjects Methode, beim ersten Aufruf klappt alles super, wird ein Event aufgerufen, wird der entsprechende Code ausgeführt , beim 2ten Aufruf von WaitForMultipleObjects wird immer eine EAccessViolation geworfen, ich hab ka warum. Es ist auch egal was für Code ich nach WairForMultipleObjects ausführe, der 2te Aufruf schlägt immer fehl.</p>
<p>Hier die Execute-Methode:</p>
<pre><code class="language-cpp">bool succesfull=false;
     	  m_bThreadShouldRun=true;

          try
          {

	  while(!this-&gt;Terminated)
	  {
	   //hauptschleife, die immerwieder durchlaufen wird
	   m_aktStatus=&quot;Hauptschleife&quot;;
	   //m_LastActionThread=GetTickCount();
	   //damit der rechner nicht an der leistungsgrenze läuft
	   //Sleep(1);
           //
	   //wenn initialisiert werden soll

           //neuer Code mit WaitForMultipleObjects
           DWORD event=WaitForMultipleObjects(6,m_AllEvents,false,INFINITE);
           switch(event)
           {
           case WAIT_OBJECT_0:
                //Starte ROD4
                 if(m_CanInit)
		  {
		   //zeugs für rauschunterdrückung initialisieren
		   m_Bilder=new TMessung[m_AnzBilderRauschunterdrueckung];
		   for (int counter=0; counter&lt;m_AnzBilderRauschunterdrueckung; counter++)
		   {
			m_Bilder[counter].sPunkte=NULL;
		   }

		   //rod4 initialisierem
		   if(InitRod4())
		   {
			   m_CanInit=false;
			   m_aktThreadStatus=STATUS_NONE;
			   TRACE(&quot;Rod4 wurde initialisiert&quot;,false);
		   }
		   else
		   {
			m_aktThreadStatus=STATUS_NONE;
		   }
		  }
                  ResetEvent(m_EventStarteRod4);
                break;
           case WAIT_OBJECT_0+1:
                //Stoppe ROD4
                //falls der rod4 initialisiert ist, dll freigeben
		if(m_CanInit==false)
			ReleaseRod4();
		//es kann aktuell keine bild geliefert werden
		if(m_Bilder!=NULL)
			delete[] m_Bilder;
		if(PunkteBuffer!=NULL)
			delete[] PunkteBuffer;
		if(PunkteBufferBig!=NULL)
			delete[] PunkteBufferBig;
		if(m_bPointsFromFile)
		{
			for(int counter=0; counter&lt;m_PunkteVektor.size(); counter++)
			{
				delete[] m_PunkteVektor[counter].sPunkte;
			}
		}
		m_Bilder=NULL;
		PunkteBuffer=NULL;
		PunkteBufferBig=NULL;			
		//bildspeicher löschen
		 m_CanGetBild=false;
		 m_aktStatus=&quot;Beende dll&quot;;
		 //letzten error auf 0 setzen
		 m_lastError=-1;
		 m_AnzMesspunkte=0;
		 m_PunkteAvailable=false;
		 m_CanInit=true;
		 m_aktBildStatus=STATUS_NOTHING;
		 m_aktThreadStatus=STATUS_NONE;
		 m_CanInit=true;
		 m_bRod4ShouldRun=false;
		 TRACE(&quot;DLL wurde freigegeben&quot;,false);
                 ResetEvent(m_EventStoppeRod4);
                break;
           case WAIT_OBJECT_0+2:
                //MakeNewPicture
                //ein rauschfreies bild, aus den gesammelten erstellen
		m_aktStatus=&quot;Neues bild wird erstellt.&quot;;
		CreateRauschfreiesBild();
		m_aktBildStatus=STATUS_NOTHING;
                ResetEvent(m_EventMakeNewPicture);
                break;
           case WAIT_OBJECT_0+3:
                //MakeReferenzScan
      		TRACE(&quot;__DEBUG: ROD4Handler: NullScan wurde angefordert&quot;,true);
		MakeNullScan(m_aktNullScanName);
		bMakeNullScan=false;
                TRACE(&quot;__DEBUG: NullScan erstellt.&quot;,true);
                ResetEvent(m_EventMakeReferenzScan);
                break;
           case WAIT_OBJECT_0+4:
                //FindAllEdges
      		m_aktBildStatus=STATUS_FINDEDGES;
		ClearEdgeArray();
		succesfull=false;
		succesfull=FindAllEdges(0);
		//nachbearbeiten der gefundenen ecken
		if(succesfull)
                {
                	    //m_bCanGetEdges=NachbearbeitungEcken();
		            m_bCanGetEdges=true;
                }
                else
                {
                 m_bCanGetEdges=false;
                }
		bFindEdges=false;
		m_aktBildStatus=STATUS_NOTHING;
                ResetEvent(m_EventFindAllEdges);
                break;
           case WAIT_OBJECT_0+5:
                //LoadNewPoints
               	if(m_aktPunkte&gt;=m_PunkteVektor.size())
			{
				m_aktPunkte=0;
				//TRACE(&quot;Punkte zuende&quot;,true);
				m_aktThreadStatus=STATUS_STOPDLL;
			}
			else
			{
				//TRACE(&quot;Neue Punkte laden:&quot;+IntToStr(m_aktPunkte),true);
				NextPointsFromFile(m_PunkteVektor.at(m_aktPunkte));
				m_aktPunkte++;
				//m_LastTimeNewPoints=GetTickCount();
			}
                //ResetEvent(m_EventLoadNewPoints);
                break;
           default:
                //fehler
                break;
           }
</code></pre>
<p>Hab auch schon gegoogelt, die Forensuche benutzt, aber nicht wirklich eine Lösung gefunden, wäre für jeden Vorschlag dankbar.</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
<p>/Edit : Bitte beim nächsten Posten von Code beachten das es auch extra Tags für C++ Code gibt!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189162/tthread-waitformultipleobjects-eaccessviolation</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 02:57:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189162.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Aug 2007 09:48:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 13:49:04 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich habe in der Execute-Methode eines Threads die WaitForMultipleObjects Methode, beim ersten Aufruf klappt alles super, wird ein Event aufgerufen, wird der entsprechende Code ausgeführt , beim 2ten Aufruf von WaitForMultipleObjects wird immer eine EAccessViolation geworfen, ich hab ka warum. Es ist auch egal was für Code ich nach WairForMultipleObjects ausführe, der 2te Aufruf schlägt immer fehl.</p>
<p>Hier die Execute-Methode:</p>
<pre><code class="language-cpp">bool succesfull=false;
     	  m_bThreadShouldRun=true;

          try
          {

	  while(!this-&gt;Terminated)
	  {
	   //hauptschleife, die immerwieder durchlaufen wird
	   m_aktStatus=&quot;Hauptschleife&quot;;
	   //m_LastActionThread=GetTickCount();
	   //damit der rechner nicht an der leistungsgrenze läuft
	   //Sleep(1);
           //
	   //wenn initialisiert werden soll

           //neuer Code mit WaitForMultipleObjects
           DWORD event=WaitForMultipleObjects(6,m_AllEvents,false,INFINITE);
           switch(event)
           {
           case WAIT_OBJECT_0:
                //Starte ROD4
                 if(m_CanInit)
		  {
		   //zeugs für rauschunterdrückung initialisieren
		   m_Bilder=new TMessung[m_AnzBilderRauschunterdrueckung];
		   for (int counter=0; counter&lt;m_AnzBilderRauschunterdrueckung; counter++)
		   {
			m_Bilder[counter].sPunkte=NULL;
		   }

		   //rod4 initialisierem
		   if(InitRod4())
		   {
			   m_CanInit=false;
			   m_aktThreadStatus=STATUS_NONE;
			   TRACE(&quot;Rod4 wurde initialisiert&quot;,false);
		   }
		   else
		   {
			m_aktThreadStatus=STATUS_NONE;
		   }
		  }
                  ResetEvent(m_EventStarteRod4);
                break;
           case WAIT_OBJECT_0+1:
                //Stoppe ROD4
                //falls der rod4 initialisiert ist, dll freigeben
		if(m_CanInit==false)
			ReleaseRod4();
		//es kann aktuell keine bild geliefert werden
		if(m_Bilder!=NULL)
			delete[] m_Bilder;
		if(PunkteBuffer!=NULL)
			delete[] PunkteBuffer;
		if(PunkteBufferBig!=NULL)
			delete[] PunkteBufferBig;
		if(m_bPointsFromFile)
		{
			for(int counter=0; counter&lt;m_PunkteVektor.size(); counter++)
			{
				delete[] m_PunkteVektor[counter].sPunkte;
			}
		}
		m_Bilder=NULL;
		PunkteBuffer=NULL;
		PunkteBufferBig=NULL;			
		//bildspeicher löschen
		 m_CanGetBild=false;
		 m_aktStatus=&quot;Beende dll&quot;;
		 //letzten error auf 0 setzen
		 m_lastError=-1;
		 m_AnzMesspunkte=0;
		 m_PunkteAvailable=false;
		 m_CanInit=true;
		 m_aktBildStatus=STATUS_NOTHING;
		 m_aktThreadStatus=STATUS_NONE;
		 m_CanInit=true;
		 m_bRod4ShouldRun=false;
		 TRACE(&quot;DLL wurde freigegeben&quot;,false);
                 ResetEvent(m_EventStoppeRod4);
                break;
           case WAIT_OBJECT_0+2:
                //MakeNewPicture
                //ein rauschfreies bild, aus den gesammelten erstellen
		m_aktStatus=&quot;Neues bild wird erstellt.&quot;;
		CreateRauschfreiesBild();
		m_aktBildStatus=STATUS_NOTHING;
                ResetEvent(m_EventMakeNewPicture);
                break;
           case WAIT_OBJECT_0+3:
                //MakeReferenzScan
      		TRACE(&quot;__DEBUG: ROD4Handler: NullScan wurde angefordert&quot;,true);
		MakeNullScan(m_aktNullScanName);
		bMakeNullScan=false;
                TRACE(&quot;__DEBUG: NullScan erstellt.&quot;,true);
                ResetEvent(m_EventMakeReferenzScan);
                break;
           case WAIT_OBJECT_0+4:
                //FindAllEdges
      		m_aktBildStatus=STATUS_FINDEDGES;
		ClearEdgeArray();
		succesfull=false;
		succesfull=FindAllEdges(0);
		//nachbearbeiten der gefundenen ecken
		if(succesfull)
                {
                	    //m_bCanGetEdges=NachbearbeitungEcken();
		            m_bCanGetEdges=true;
                }
                else
                {
                 m_bCanGetEdges=false;
                }
		bFindEdges=false;
		m_aktBildStatus=STATUS_NOTHING;
                ResetEvent(m_EventFindAllEdges);
                break;
           case WAIT_OBJECT_0+5:
                //LoadNewPoints
               	if(m_aktPunkte&gt;=m_PunkteVektor.size())
			{
				m_aktPunkte=0;
				//TRACE(&quot;Punkte zuende&quot;,true);
				m_aktThreadStatus=STATUS_STOPDLL;
			}
			else
			{
				//TRACE(&quot;Neue Punkte laden:&quot;+IntToStr(m_aktPunkte),true);
				NextPointsFromFile(m_PunkteVektor.at(m_aktPunkte));
				m_aktPunkte++;
				//m_LastTimeNewPoints=GetTickCount();
			}
                //ResetEvent(m_EventLoadNewPoints);
                break;
           default:
                //fehler
                break;
           }
</code></pre>
<p>Hab auch schon gegoogelt, die Forensuche benutzt, aber nicht wirklich eine Lösung gefunden, wäre für jeden Vorschlag dankbar.</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
<p>/Edit : Bitte beim nächsten Posten von Code beachten das es auch extra Tags für C++ Code gibt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341348</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 10:00:25 GMT]]></title><description><![CDATA[<p>Was ich noch vergessen habe:</p>
<p>m_AllEvents wird folgendermaßen erstellt:</p>
<pre><code>m_AllEvents=new HANDLE[6];
          m_AllEvents[0]=m_EventStarteRod4;
          m_AllEvents[1]=m_EventStoppeRod4;
          m_AllEvents[2]=m_EventMakeNewPicture;
          m_AllEvents[3]=m_EventMakeReferenzScan;
          m_AllEvents[4]=m_EventFindAllEdges;
          m_AllEvents[5]=m_EventLoadNewPoints;
</code></pre>
<p>Und so werden die Events erstellt:</p>
<pre><code>m_EventStarteRod4=CreateEvent(NULL,true,false,&quot;StarteRod4&quot;);
          m_EventStoppeRod4=CreateEvent(NULL,true,false,&quot;StoppeRod4&quot;);
          m_EventMakeNewPicture=CreateEvent(NULL,true,false,&quot;MakeNewPicture&quot;);
        m_EventMakeReferenzScan=CreateEvent(NULL,true,false,&quot;MakeReferenzScan&quot;);
          m_EventFindAllEdges=CreateEvent(NULL,true,false,&quot;FindAllEdges&quot;);
          m_EventLoadNewPoints=CreateEvent(NULL,true,false,&quot;LoadNewPoints&quot;);
</code></pre>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341360</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 10:00:25 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 12:46:42 GMT]]></title><description><![CDATA[<p>Wirf mal den Debugger an und schau nach, in welcher Zeile der Fehler passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341502</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 09 Aug 2007 12:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 13:40:44 GMT]]></title><description><![CDATA[<p>der debugger wirft mich genau bei WaitForMultipleObjects raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341554</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:40:44 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 13:53:38 GMT]]></title><description><![CDATA[<p>ReinholdFischer schrieb:</p>
<blockquote>
<p>m_AllEvents wird folgendermaßen erstellt:</p>
<p>[...]</p>
<p>Und so werden die Events erstellt:</p>
<p>[...]</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
</blockquote>
<p>In welcher Reihenfolge passiert denn das? (ich hoffe doch, daß du erst deine Exents anlegst und dann in das Array reinwirfst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341562</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 13:55:11 GMT]]></title><description><![CDATA[<p>Dann bleibt ja nur die Möglichkeit, dass eines der Events gelöscht wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341566</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 13:59:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:</p>
<p>Ja klar, zuerst Events erstellen, dann in den Array gepackt.</p>
<p>@Joe_M.:</p>
<p>die Überlegung hatte ich auch schon, werde das ma genauer überprüfen, aber direkt im Quellcode steht davon nichts explizit.</p>
<p>Das ResetEvent hat damit nichts zu tun, oder?</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341573</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 13:59:26 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 14:09:12 GMT]]></title><description><![CDATA[<p>Also, es wird immer komischer, jetzt bekomme ich die AccessViolation schon beim ersten Aufruf von WaitForMultipleObjects, AllEvents ist zur Laufzeit mit Daten gefüllt, kein Nullzeiger dabei.</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341584</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 14:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 14:14:24 GMT]]></title><description><![CDATA[<p>Also, den ersten Fehler habe ich gefunden, ich erstelle den TThread mit false im Konstruktor, also das er sofort losläuft.</p>
<p>Dadurch ist es zeitweise vorgekommen, das die Execute-Methode angelaufen ist, bevor m_AllEvents erstellt wurde.</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341588</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 14:14:24 GMT</pubDate></item><item><title><![CDATA[Reply to TThread , WaitForMultipleObjects , EAccessViolation on Thu, 09 Aug 2007 16:25:17 GMT]]></title><description><![CDATA[<p>Ich habe aus dem Pointer m_AllEvents ein festes Array gemacht, seitdem gibts keine EInvalidAccess Exception mehr, jedoch liefert WaitForMultipleObjects jetzt WAIT_FAILED zurück, GetLastError liefert Handle is invalid.</p>
<p>Ich hab jedoch ka warum.</p>
<p>Irgendwelche Ideen?</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341726</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Thu, 09 Aug 2007 16:25:17 GMT</pubDate></item></channel></rss>