<?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[Mein Thread haut mir die Hufe wech...]]></title><description><![CDATA[<p>Aloha,</p>
<p>habe diverse Threads über Threads ( lol ) gelesen, aber nicht die Beantwortung meines Probs gefunden.</p>
<p>Ich habe eine Klasse namens Form1.</p>
<p>Diese beinhaltet diesen tollen Workerthread ( nennt man dies so ? ).</p>
<pre><code>// in der form1.h
static UINT check_mail(LPVOID);

// in der form1.cpp
UINT CForm1::check_mail(LPVOID pParam)
{

    hier wird eine InternetConnection aufgemacht und ein FTP - Server nach bestimmten Dateien befragt.

}
</code></pre>
<p>Ich habe das Vorgehen von Henkesoft gemopst...<br />
Ich starte den Thread in der OnInitialUpdate der Formviewklasse per Timer alle 5 Minuten zum Beispiel.</p>
<pre><code>SetTimer(1,30000,NULL);

void CForm1::OnTimer(UINT nIDEvent) 
{
	switch(nIDEvent){

	case 1:

		AfxBeginThread (check_mail, this);
		break;

	}

	CFormView::OnTimer(nIDEvent);
}
</code></pre>
<p>Der Workerthread benötigt je nach Verbindung und ob etwas gedownloaded werden muß ca. 10sec bis 30 sec.</p>
<p>Wenn der Thread nu am rödeln ist, und brav nach Dateien auf dem FTP-Server Ausschau hält, und ich gleichzeitig das Proggi schließe, sehe ich, daß das Proggi nicht sauber geschlossen wird, sondern es bilden sich Memory-Leaks.</p>
<p>Ist mir ja auch klar, der Thread ist noch mitten drinne, z.B. durchforstet er gerade Verzeichnisse auf dem Server, dann haue ich ihm die Füße weg, indem ich auf das kleine Kreuzchen in der rechten oberen Ecke drügge...</p>
<p>Wie bekomme ich mein Programm dazu auf das Verlassen von Thread zu warten bis es sich schließt, oder wie beende den Thread sauber mittendrin ( was die schlechtere Variante wäre, wenn er gerade irgendetwas wichtiges macht ).</p>
<p>Es gibt zwar keinen Absturz momentan, aber es bleiben laut debugger memory leaks, und das ist Hackerscheiße...</p>
<p>Beste Grüße</p>
<p>BOA</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/67575/mein-thread-haut-mir-die-hufe-wech</link><generator>RSS for Node</generator><lastBuildDate>Sat, 06 Jun 2026 11:06:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/67575.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Mar 2004 19:45:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 09:19:15 GMT]]></title><description><![CDATA[<p>Aloha,</p>
<p>habe diverse Threads über Threads ( lol ) gelesen, aber nicht die Beantwortung meines Probs gefunden.</p>
<p>Ich habe eine Klasse namens Form1.</p>
<p>Diese beinhaltet diesen tollen Workerthread ( nennt man dies so ? ).</p>
<pre><code>// in der form1.h
static UINT check_mail(LPVOID);

// in der form1.cpp
UINT CForm1::check_mail(LPVOID pParam)
{

    hier wird eine InternetConnection aufgemacht und ein FTP - Server nach bestimmten Dateien befragt.

}
</code></pre>
<p>Ich habe das Vorgehen von Henkesoft gemopst...<br />
Ich starte den Thread in der OnInitialUpdate der Formviewklasse per Timer alle 5 Minuten zum Beispiel.</p>
<pre><code>SetTimer(1,30000,NULL);

void CForm1::OnTimer(UINT nIDEvent) 
{
	switch(nIDEvent){

	case 1:

		AfxBeginThread (check_mail, this);
		break;

	}

	CFormView::OnTimer(nIDEvent);
}
</code></pre>
<p>Der Workerthread benötigt je nach Verbindung und ob etwas gedownloaded werden muß ca. 10sec bis 30 sec.</p>
<p>Wenn der Thread nu am rödeln ist, und brav nach Dateien auf dem FTP-Server Ausschau hält, und ich gleichzeitig das Proggi schließe, sehe ich, daß das Proggi nicht sauber geschlossen wird, sondern es bilden sich Memory-Leaks.</p>
<p>Ist mir ja auch klar, der Thread ist noch mitten drinne, z.B. durchforstet er gerade Verzeichnisse auf dem Server, dann haue ich ihm die Füße weg, indem ich auf das kleine Kreuzchen in der rechten oberen Ecke drügge...</p>
<p>Wie bekomme ich mein Programm dazu auf das Verlassen von Thread zu warten bis es sich schließt, oder wie beende den Thread sauber mittendrin ( was die schlechtere Variante wäre, wenn er gerade irgendetwas wichtiges macht ).</p>
<p>Es gibt zwar keinen Absturz momentan, aber es bleiben laut debugger memory leaks, und das ist Hackerscheiße...</p>
<p>Beste Grüße</p>
<p>BOA</p>
]]></description><link>https://www.c-plusplus.net/forum/post/476818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/476818</guid><dc:creator><![CDATA[BOA]]></dc:creator><pubDate>Wed, 10 Mar 2004 09:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Tue, 09 Mar 2004 22:44:54 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Als erstes: AfxBeginThread() liefert dir einen Zeiger auf <em>check_mail</em> zurück, den retten.</p>
<p>Z.B. so:</p>
<pre><code class="language-cpp">m_myThread = (check_mail*)
		AfxBeginThread(
		RUNTIME_CLASS(check_mail),
		THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
</code></pre>
<p>Bevor du jetzt Close-Message bearbeitest, machst du das:</p>
<pre><code class="language-cpp">if(m_myThread)
    {
    DWORD dwExitCode;
    ::GetExitCodeThread(m_myThread-&gt;m_hThread,&amp;dwExitCode);
    if(dwExitCode == STILL_ACTIVE)
        {
        ...
</code></pre>
<p>Nun kannst du deinem <em>myThread</em> entweder eine Nachricht schicken, dass er nun endlich mal zur Ruhe kommen soll:</p>
<pre><code class="language-cpp">m_myThread-&gt;PostThreadMessage(_CHECK_MAIL_BEENDEN,0,0);
if(WaitForSingleObject(m_myThread-&gt;m_hThread,1000) == WAIT_TIMEOUT)
    {
</code></pre>
<p>Wieder den Exitcode abfragen:</p>
<pre><code class="language-cpp">::GetExitCodeThread(m_myThread-&gt;m_hThread,&amp;dwExitCode);
if(dwExitCode == STILL_ACTIVE)
    {
</code></pre>
<p>In kurzerhand killen:</p>
<pre><code class="language-cpp">::TerminateThread(m_myThread-&gt;m_hThread,0);
</code></pre>
<p>Oder wieder zum Anfang springen und so lange warten, bis <em>check_mail</em> endlich fertig ist. Irgendwann würde ich aber mal die Notbremse ziehen, wenn es nach dem 10. Durchlauf immer noch nicht gut ist. Oder besser noch per MessageBox den Benutzer fragen, was nun geschehen soll.</p>
<p>Ach, ich würde dem <em>check_mail</em>-Thread (wenn du ihn nicht killst) etwas Zeit zum aufräumen geben, sonst hast du trotzdem memory leaks.</p>
<p>Gruß A.K.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/476939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/476939</guid><dc:creator><![CDATA[Andreas Kapust]]></dc:creator><pubDate>Tue, 09 Mar 2004 22:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 10:48:25 GMT]]></title><description><![CDATA[<p>Aloha Andreas,</p>
<p>vielen Dank für die ausführliche Antwort.</p>
<p>Um diesen Codeteil ausführen zu können, muß ich dem Thread ja beibringen, Nachrichten empfangen zu können.</p>
<pre><code>m_myThread-&gt;PostThreadMessage(_CHECK_MAIL_BEENDEN,0,0);
if(WaitForSingleObject(m_myThread-&gt;m_hThread,1000) == WAIT_TIMEOUT)
    {
</code></pre>
<p>Laut MSDN nutze ich dafür PeekMessage, das ich folgendermaßen innerhalb des Threads implementiert habe :</p>
<pre><code>MSG t_msg;

while(1){

     // hier passiert alles mögliche

     PeekMessage(&amp;t_msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);
     if(t_msg.message == KILL_TIMER_THREAD)
	break;

}

return 0;
</code></pre>
<p>Ich tippe, daß ich mich bei PeekMessage glatt anstelle, falsche Parameter setze oder an der falschen Stelle aufrufe.</p>
<p>Ich werd wahnsinnig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> , denn wenn ich den Thread einfach per</p>
<pre><code>::TerminateThread(m_myThread-&gt;m_hThread,0);
</code></pre>
<p>kille, habe ich immer noch die Memory Leaks.</p>
<p>Ich muß den Thread zum normalen return 0; führen, dann sollte es funzen, dazu muß er aber auf die geworfene Nachricht reagieren.</p>
<p>Grüße</p>
<p>BOA</p>
]]></description><link>https://www.c-plusplus.net/forum/post/477187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/477187</guid><dc:creator><![CDATA[BOA]]></dc:creator><pubDate>Wed, 10 Mar 2004 10:48:25 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 11:09:41 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Klar bei TerminateThread() hast du wieder Memory Leaks. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Der sauberste Weg ist wirklich zu schauen ob der Thread noch läuft und falls dem so ist, den Benutzer darüber zu informieren, dass noch Hintergrundaktivitäten am laufen sind.</p>
<p>Bricht er dann ab, schickst du deinem Thread 'n Message.</p>
<p>Ein anderer 'harter' Weg: Verhindere das Schließen des Hauptfensters während des Transfers. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Solltest du das mit der Message nicht hinbekommen, kann ich abends noch mal nachschauen, wie ich das damals bei meinem Verzeichnisüberwachungs-Thread geregelt habe. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Gruß A.K.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/477206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/477206</guid><dc:creator><![CDATA[Andreas Kapust]]></dc:creator><pubDate>Wed, 10 Mar 2004 11:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 12:04:56 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>verwende eine der Synchronisierungsklassen:</p>
<pre><code class="language-cpp">CEvent
CSemaphore
CMutex
CCriticalSection
</code></pre>
<p>um ein &quot;Statusanzeigeobjekt&quot; herzustellen.<br />
Dieses aktivierst du, wenn der Thread beendet werden soll (der Thread muss natürlich auch immer wieder darauf zugreifen und sich ggf. beenden).</p>
<p>Grüße Rapha</p>
]]></description><link>https://www.c-plusplus.net/forum/post/477259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/477259</guid><dc:creator><![CDATA[Rapha]]></dc:creator><pubDate>Wed, 10 Mar 2004 12:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 12:12:19 GMT]]></title><description><![CDATA[<p>Andreas Kapust schrieb:</p>
<blockquote>
<p>Hi!</p>
<p>Klar bei TerminateThread() hast du wieder Memory Leaks. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Der sauberste Weg ist wirklich zu schauen ob der Thread noch läuft und falls dem so ist, den Benutzer darüber zu informieren, dass noch Hintergrundaktivitäten am laufen sind.</p>
<p>Bricht er dann ab, schickst du deinem Thread 'n Message.</p>
<p>Ein anderer 'harter' Weg: Verhindere das Schließen des Hauptfensters während des Transfers. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Solltest du das mit der Message nicht hinbekommen, kann ich abends noch mal nachschauen, wie ich das damals bei meinem Verzeichnisüberwachungs-Thread geregelt habe. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Gruß A.K.</p>
</blockquote>
<p>Aloha,</p>
<p>auch wenn ich es &quot;hinbekomme&quot;, würde mich das Thema weiterhin interessieren, soll heißen, wäre klasse, wenn Du noch einmal nachschauen könntest.</p>
<p>Fühl Dich erstmal virtuell geküßt für die bisherigen Tip(p)s. <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="😉"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3825">@Rapha</a></p>
<p>thx erstmal, werde mich mal mit den Klassen schlaumachen, wie diese mir nützen könnten.</p>
<p>Ich berichte...</p>
<p>Grüße und Danke</p>
<p>BOA</p>
]]></description><link>https://www.c-plusplus.net/forum/post/477273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/477273</guid><dc:creator><![CDATA[BOA]]></dc:creator><pubDate>Wed, 10 Mar 2004 12:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 12:17:05 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>in der MSDN (zumindest bei mir VC++ 6.0) gibts eine Ziemlich gute Anleitung (auf Deutsch) zu Threads (schließen, synchronisieren,...)</p>
<p>Du gelangst folgendermaßen hin:<br />
Öffne die Hilfe der MSDN zu AfxBeginThread, scroll ganz runter, klick auf den Link &quot;Multithreading: Creating Worker Threads&quot; und in &quot;Multithreading: Erstellen von Worker-Threads&quot; dann oben auf den Link &quot;Übersicht&quot;. Viel Spaß</p>
<p>Grüße Rapha</p>
]]></description><link>https://www.c-plusplus.net/forum/post/477283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/477283</guid><dc:creator><![CDATA[Rapha]]></dc:creator><pubDate>Wed, 10 Mar 2004 12:17:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mein Thread haut mir die Hufe wech... on Wed, 10 Mar 2004 12:41:50 GMT]]></title><description><![CDATA[<p>Rapha schrieb:</p>
<blockquote>
<p>Hi</p>
<p>in der MSDN (zumindest bei mir VC++ 6.0) gibts eine Ziemlich gute Anleitung (auf Deutsch) zu Threads (schließen, synchronisieren,...)</p>
<p>Du gelangst folgendermaßen hin:<br />
Öffne die Hilfe der MSDN zu AfxBeginThread, scroll ganz runter, klick auf den Link &quot;Multithreading: Creating Worker Threads&quot; und in &quot;Multithreading: Erstellen von Worker-Threads&quot; dann oben auf den Link &quot;Übersicht&quot;. Viel Spaß</p>
<p>Grüße Rapha</p>
</blockquote>
<p>Thx a lot,</p>
<p>mache ich gleich mal...</p>
<p>Grüße</p>
<p>BOA</p>
]]></description><link>https://www.c-plusplus.net/forum/post/477324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/477324</guid><dc:creator><![CDATA[BOA]]></dc:creator><pubDate>Wed, 10 Mar 2004 12:41:50 GMT</pubDate></item></channel></rss>