<?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[Thread Problem im Release Modus]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein sehr merkwürdiges Problem: Ich habe ein Programm in MFC/Visual C++ geschrieben, dass zwei Threads erzeugt. Wenn ich das Programm im Debug-Modus starte, läuft es einwandfrei. Im Release Modus jedoch springt es aus dem einen Thread eher heraus als es soll! Warum?<br />
Mein Programm im Detail:<br />
Über einen Button wird mit dem Aufruf<br />
&gt; AfxBeginThread(Thread1, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL); &lt;<br />
der Thread1 gestartet. In diesem Thread wird eine Liste erzeugt mit 10 Listenelementen, wobei eine Verzögerung von 2 Sek. (Sleep(2000)) zwischen dem Anfügen der jeweiligen Listenelemente eingebaut ist.<br />
Über einen zweiten Button wird mit dem Aufruf<br />
&gt; AfxBeginThread(Thread2, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL); &lt;<br />
der zweite Thread gestartet. Hier wird auf die in Thread1 zu erstellende Liste zugegriffen und die Listenelemente über den LPT versendet.<br />
Das Problem tritt auf, wenn:<br />
Drücke ich den ersten Button, so wird Thread1 (Erstellen der Liste) gestartet. Warte ich bis die Liste vollständig erstellt wurde (alle 10 Listenelemente) und drücke dann den Button2 (starten von Thread2), so tut Thread2 genau das was ich erwarte: er versendet die 10 Listenelemente über den LPT.<br />
Drücke ich aber den Button2 (starten von Thread2) während noch die Listenelemente in Thread1 erstellt werden, so werden in Thread2 nur die Listenelemente über den LPT versendet, die zum Zeitpunkt des Drückens des Button2 in der Liste stehen. Die noch anzuhängenden Listenelemente werden nicht berücksichtigt, OBWOHL in Thread2 solange gewartet werden soll, bis alle Listenelemente da sind.<br />
Dieses Problem tritt komischerweise aber nur im Release-Modus auf, im Debug-Modus wird im Thread2 solange gewartet bis alle Listenelemente da sind.<br />
Warum macht es der Debug-Modus, aber nicht der Release-Modus?<br />
Es wäre echt nett, wenn mir jemand helfen könnte. Bin da so ziemlich ratlos, ehrlich gesagt.<br />
Danke,<br />
Grüße<br />
JohnTK</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/80318/thread-problem-im-release-modus</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 04:35:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/80318.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Jul 2004 08:54:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread Problem im Release Modus on Tue, 20 Jul 2004 08:54:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein sehr merkwürdiges Problem: Ich habe ein Programm in MFC/Visual C++ geschrieben, dass zwei Threads erzeugt. Wenn ich das Programm im Debug-Modus starte, läuft es einwandfrei. Im Release Modus jedoch springt es aus dem einen Thread eher heraus als es soll! Warum?<br />
Mein Programm im Detail:<br />
Über einen Button wird mit dem Aufruf<br />
&gt; AfxBeginThread(Thread1, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL); &lt;<br />
der Thread1 gestartet. In diesem Thread wird eine Liste erzeugt mit 10 Listenelementen, wobei eine Verzögerung von 2 Sek. (Sleep(2000)) zwischen dem Anfügen der jeweiligen Listenelemente eingebaut ist.<br />
Über einen zweiten Button wird mit dem Aufruf<br />
&gt; AfxBeginThread(Thread2, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL); &lt;<br />
der zweite Thread gestartet. Hier wird auf die in Thread1 zu erstellende Liste zugegriffen und die Listenelemente über den LPT versendet.<br />
Das Problem tritt auf, wenn:<br />
Drücke ich den ersten Button, so wird Thread1 (Erstellen der Liste) gestartet. Warte ich bis die Liste vollständig erstellt wurde (alle 10 Listenelemente) und drücke dann den Button2 (starten von Thread2), so tut Thread2 genau das was ich erwarte: er versendet die 10 Listenelemente über den LPT.<br />
Drücke ich aber den Button2 (starten von Thread2) während noch die Listenelemente in Thread1 erstellt werden, so werden in Thread2 nur die Listenelemente über den LPT versendet, die zum Zeitpunkt des Drückens des Button2 in der Liste stehen. Die noch anzuhängenden Listenelemente werden nicht berücksichtigt, OBWOHL in Thread2 solange gewartet werden soll, bis alle Listenelemente da sind.<br />
Dieses Problem tritt komischerweise aber nur im Release-Modus auf, im Debug-Modus wird im Thread2 solange gewartet bis alle Listenelemente da sind.<br />
Warum macht es der Debug-Modus, aber nicht der Release-Modus?<br />
Es wäre echt nett, wenn mir jemand helfen könnte. Bin da so ziemlich ratlos, ehrlich gesagt.<br />
Danke,<br />
Grüße<br />
JohnTK</p>
]]></description><link>https://www.c-plusplus.net/forum/post/564250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/564250</guid><dc:creator><![CDATA[JohnTK]]></dc:creator><pubDate>Tue, 20 Jul 2004 08:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Problem im Release Modus on Tue, 20 Jul 2004 15:36:52 GMT]]></title><description><![CDATA[<p>du machst ne Thread-synchronisation über Sleep !?!?!? o_O<br />
autsch</p>
<p>hier ein bsp wie du so was thread-sicher hinbekommst:</p>
<pre><code class="language-cpp">class Foo
{
  volatile int m_iItemCount; // da steht drinnen wieviele items in deiner liste sind
  HANDLE	m_hNewDataEvent; // event damit thread 2 mitbekommt wann neue daten da sind

  Foo() {
    m_iItemCount = 0;
    m_hNewDataEvent = CreateEvent(NULL,FALSE,FALES,NULL);
  }

   void Thread1()  // dein thread 1
   {
     put_data_into_list(); // stecke was neues in die liste
     InterlockedIncrement(&amp;m_iItemCount); // zähle dein counter hoch
     SetEvent(m_hNewDataEvent); // sage thread 2: &quot;was neues ist da&quot;
   }

   void Thread2() // dein thread 2
   {
      while(...)
      { 
         // da die CPU wichtigeres zu tun hat als ein variable in ner 
         // schleife zu checken, machen wir erst was sobald auch daten da sind
         if(WaitForSingleObject(m_hNewDataEvent,INFINITE)==WAIT_OBJECT_0)
         {
           while(m_iItemCount&gt;0) // solange noch was in der liste steht
           {
             send_data_to_LPT_port(); // schicke es zum LPT port raus
             InterlockedDecrement(m_iItemCount); // decrementiere den zähler
           }
         }
      }
   }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/564574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/564574</guid><dc:creator><![CDATA[CMatt]]></dc:creator><pubDate>Tue, 20 Jul 2004 15:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to Thread Problem im Release Modus on Wed, 21 Jul 2004 12:43:44 GMT]]></title><description><![CDATA[<p>Danke, CMatt. Dieser Tip hat mir echt weitergeholfen.</p>
<p>Allerdings hab ich keine Thread-Synchronisation über Sleep gemacht, das Sleep war nur dazu da, bei der Erzeugung von Listenelementen 2 Sekunden zu warten, bevor neues Listenelement erstellt wird. Kann somit gucken, ob der zweite Thread auf alle Elemente wartet.<br />
Das Einbauen des Events hat die Lösung zu meinem Problem gebracht. Danke nochmals.<br />
Gruß<br />
JohnTK</p>
]]></description><link>https://www.c-plusplus.net/forum/post/565187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/565187</guid><dc:creator><![CDATA[JohnTK]]></dc:creator><pubDate>Wed, 21 Jul 2004 12:43:44 GMT</pubDate></item></channel></rss>