<?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 und Dialoge]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche eine große Dateioperation so zu gestalten, dass der Benutzer einen Wait Dialog angezeigt bekommt, den er auch abbrechen kann.</p>
<p>Leider bekomme ich eine Assertion beim Abbruch und ich weiß nicht wieso.</p>
<p>Hier mein Code</p>
<pre><code class="language-cpp">//--CLASS-----------------------------------
class:

   bool m_thrActive;
   CWait m_Wait;
   bool m_Flag;
   void thrRun();
   static UINT thrFunction(LPVOID pParam);  

//--Main Thread------------------------------

void MyApp::OnBtn1() 
{
   m_Flag = true; 
   m_thrActive = false;
   CWinThread* pThread = AfxBeginThread(thrFunction, this); 	

   while(!m_thrActive)
      Sleep(10);

   if(IDOK==m_Wait.DoModal())
   {
      addLog(&quot;Dump complete&quot;);
   }
   else
   {
      m_Flag=false;
      addLog(&quot;dump failed&quot;);
   }
}

//--Translator-------------------------------
UINT MyApp::thrFunction(LPVOID pParam) 
{ 
  MyApp* pDlg = (MyApp*) pParam; 

  pDlg-&gt;thrRun(); 
  return 0; 
} 

//--Work Thread------------------------------
void MyApp::thrRun() 
{ 
   FILE *fp;

   m_thrActive=true;

   fp = fopen(&quot;test.txt&quot;,&quot;w&quot;);
   if(fp==NULL)
   {
      MessageBox(&quot;error creating file&quot;,&quot;error&quot;,MB_OK);
      return;
   }

   while(m_Flag)
   {
      fprintf(fp,&quot;mach irgendwas&quot;);
   }
   fclose(fp);

   if(m_Flag)
      m_Wait.EndDialog(IDOK);
}
</code></pre>
<p>Danke!</p>
<p><em>Mod-Edit: In Farbe dürfte der code gleich viel übersichtlicher aussehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185722/thread-und-dialoge</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 22:28:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185722.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jun 2007 12:55:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread und Dialoge on Sat, 30 Jun 2007 12:59:30 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche eine große Dateioperation so zu gestalten, dass der Benutzer einen Wait Dialog angezeigt bekommt, den er auch abbrechen kann.</p>
<p>Leider bekomme ich eine Assertion beim Abbruch und ich weiß nicht wieso.</p>
<p>Hier mein Code</p>
<pre><code class="language-cpp">//--CLASS-----------------------------------
class:

   bool m_thrActive;
   CWait m_Wait;
   bool m_Flag;
   void thrRun();
   static UINT thrFunction(LPVOID pParam);  

//--Main Thread------------------------------

void MyApp::OnBtn1() 
{
   m_Flag = true; 
   m_thrActive = false;
   CWinThread* pThread = AfxBeginThread(thrFunction, this); 	

   while(!m_thrActive)
      Sleep(10);

   if(IDOK==m_Wait.DoModal())
   {
      addLog(&quot;Dump complete&quot;);
   }
   else
   {
      m_Flag=false;
      addLog(&quot;dump failed&quot;);
   }
}

//--Translator-------------------------------
UINT MyApp::thrFunction(LPVOID pParam) 
{ 
  MyApp* pDlg = (MyApp*) pParam; 

  pDlg-&gt;thrRun(); 
  return 0; 
} 

//--Work Thread------------------------------
void MyApp::thrRun() 
{ 
   FILE *fp;

   m_thrActive=true;

   fp = fopen(&quot;test.txt&quot;,&quot;w&quot;);
   if(fp==NULL)
   {
      MessageBox(&quot;error creating file&quot;,&quot;error&quot;,MB_OK);
      return;
   }

   while(m_Flag)
   {
      fprintf(fp,&quot;mach irgendwas&quot;);
   }
   fclose(fp);

   if(m_Flag)
      m_Wait.EndDialog(IDOK);
}
</code></pre>
<p>Danke!</p>
<p><em>Mod-Edit: In Farbe dürfte der code gleich viel übersichtlicher aussehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315613</guid><dc:creator><![CDATA[jogiJogi]]></dc:creator><pubDate>Sat, 30 Jun 2007 12:59:30 GMT</pubDate></item><item><title><![CDATA[Reply to Thread und Dialoge on Sat, 30 Jun 2007 13:04:01 GMT]]></title><description><![CDATA[<p>Mit einem Dialogfenster darf nur derjenige arbeiten, der es auch angelegt hat. Da ist es klar, daß es kracht, wenn jemand von außen (in deinem Fall der Worker-Thread) versucht, den Dialog abzuschießen.<br />
(mal davon abgesehen, daß du erst zu dem EndDialog()-Aufruf kommst, nachdem der Dialog sich bereits von selbst beendet hat (durch Betätigung der &quot;Abbrechen&quot;-Taste).</p>
<p>Du kannst von außen bestenfalls eine Nachricht per SendMessage() oder PostMessage() an diesen Dialog schicken, die er dann verarbeiten müsste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315618</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 30 Jun 2007 13:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to Thread und Dialoge on Sat, 30 Jun 2007 17:45:15 GMT]]></title><description><![CDATA[<p>Verwende PostMessage um im worker Thread mit dem Dialog zu kommunizieren.<br />
z.B. PostMessage(WM_USER+123, 0, 0) und im entsprechenden Handler rufst du dann EndDialog auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315801</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 30 Jun 2007 17:45:15 GMT</pubDate></item><item><title><![CDATA[Reply to Thread und Dialoge on Sat, 30 Jun 2007 17:52:00 GMT]]></title><description><![CDATA[<p>Das Problem hier ist dass Du die MFC verwendest. Die MFC benutzt threadafine Message-Maps. In einer puren Win32 API Anwendung wäre es durchaus legitim EndDialog aus einem anderen Thread aufzurufen. Interessanterweise löst EndDialog auch keine Nachricht aus, sondern setzt nur ein Flag in dem Speicher des Fensters, dass die MessageLoop terminiert.</p>
<p>Die Tipps von CStoll und hustbaer sind der richtigte Weg. PostMessage verwenden und eine entsprechende Nachricht versenden. Wenn es Dir um das direkte Beenden geht würde WM_COMMAND mit IDOK oder IDCANCEL schon den Job machen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315805</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sat, 30 Jun 2007 17:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Thread und Dialoge on Sun, 01 Jul 2007 07:35:53 GMT]]></title><description><![CDATA[<p>vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315964</guid><dc:creator><![CDATA[jogijogi]]></dc:creator><pubDate>Sun, 01 Jul 2007 07:35:53 GMT</pubDate></item></channel></rss>