<?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[File Handle innerhalb eines Threads bei SuspendThread() schließen]]></title><description><![CDATA[<p>Tag zusammen.</p>
<p>In meinem Projekt habe ich unter Umständen mehrere Threads laufen, die jeweils in eine Datei schreiben. Der Benutzer soll diesen Thread jetzt mittels Context Menü abbrechen können. Die Threads starte ich mit AfxBeginThread und den CWinThread Pointer speichere ich in einer Member Variable. Momentan stoppe ich den Thread mittels pThread-&gt;SuspendThread(). Was zwar zur Folge hat, dass nicht mehr in die Datei geschrieben wird, jedoch ist die Datei danach noch immer geöffnet, d.h. sie kann im Windows Explorer nicht gelöscht werden oder ähnliches.<br />
Die ofstream Variable wird dabei in der Threadfunktion selbst angelegt.<br />
Wie kann ich bewirken, dass die Datei bei SuspendThread() wieder freigegeben wird?<br />
Gibt es eventuell noch eine andere Funktion?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200986/file-handle-innerhalb-eines-threads-bei-suspendthread-schließen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Apr 2026 20:28:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200986.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Dec 2007 16:31:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Sat, 22 Dec 2007 16:31:50 GMT]]></title><description><![CDATA[<p>Tag zusammen.</p>
<p>In meinem Projekt habe ich unter Umständen mehrere Threads laufen, die jeweils in eine Datei schreiben. Der Benutzer soll diesen Thread jetzt mittels Context Menü abbrechen können. Die Threads starte ich mit AfxBeginThread und den CWinThread Pointer speichere ich in einer Member Variable. Momentan stoppe ich den Thread mittels pThread-&gt;SuspendThread(). Was zwar zur Folge hat, dass nicht mehr in die Datei geschrieben wird, jedoch ist die Datei danach noch immer geöffnet, d.h. sie kann im Windows Explorer nicht gelöscht werden oder ähnliches.<br />
Die ofstream Variable wird dabei in der Threadfunktion selbst angelegt.<br />
Wie kann ich bewirken, dass die Datei bei SuspendThread() wieder freigegeben wird?<br />
Gibt es eventuell noch eine andere Funktion?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1424860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1424860</guid><dc:creator><![CDATA[frozen-one]]></dc:creator><pubDate>Sat, 22 Dec 2007 16:31:50 GMT</pubDate></item><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Sat, 22 Dec 2007 17:52:50 GMT]]></title><description><![CDATA[<p>SuspendThread solltest du nicht verwenden, steht auch schon in der MSDN so geschrieben.<br />
Bring deinem Thread bei auf irgendein Signal zu reagieren und sich daraufhin kontrolliert selbst zu beenden. Dabei kann der Thread dann das Handle selbst freigeben.<br />
Alles andere (SuspendThread, TerminateThread) ist Murks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1424887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1424887</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 22 Dec 2007 17:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Sat, 22 Dec 2007 20:55:34 GMT]]></title><description><![CDATA[<p>Vielen Dank für deine Hilfe. Was gibt es denn für geeignete Möglichkeiten um das zu realisieren? Ich könnte ja ständig den Wert einer BOOL Variable überprüfen und wenn diese einen bestimmten Wert hat den Thread beenden usw. aber ich denke nicht, dass das eine optimale und saubere Lösung ist. Kann mir jemand vielleicht ein konkretes Beispiel geben?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1424956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1424956</guid><dc:creator><![CDATA[frozen-one]]></dc:creator><pubDate>Sat, 22 Dec 2007 20:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Sat, 22 Dec 2007 22:18:42 GMT]]></title><description><![CDATA[<p>Guck dir mal Events an, die sind oft recht nützlich. Kannst du mit CreateEvent erstellen und mit WaitForSingleObject darauf warten. Damit musst du auch kein &quot;busy waiting&quot; machen, falls du auf einen bestimmten Zustand wartest, mit <code>WAIT_TIMEOUT == WaitForSingleObject(ev,0)</code> kannst du auch zwischendurch prüfen, ob das Handle gesetzt ist. Dazu gibts noch SetEvent und ResetEvent.<br />
Ach, sieht nach MFC aus, dann schau dir einfach mal die Klasse &quot;CEvent&quot; an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1424991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1424991</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 22 Dec 2007 22:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Sun, 23 Dec 2007 00:51:37 GMT]]></title><description><![CDATA[<p>Vielen Dank Badestrand, werd ich mir morgen mal genauer ansehen das Ganze.<br />
Und ja, ich verwende MFC, hast richtig erkannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425038</guid><dc:creator><![CDATA[frozen-one]]></dc:creator><pubDate>Sun, 23 Dec 2007 00:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Sun, 23 Dec 2007 13:13:36 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-403.html" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-1.html" rel="nofollow">MFC (Visual C++)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425166</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Sun, 23 Dec 2007 13:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to File Handle innerhalb eines Threads bei SuspendThread() schließen on Tue, 25 Dec 2007 06:41:45 GMT]]></title><description><![CDATA[<p>frozen-one schrieb:</p>
<blockquote>
<p>Vielen Dank für deine Hilfe. Was gibt es denn für geeignete Möglichkeiten um das zu realisieren? Ich könnte ja ständig den Wert einer BOOL Variable überprüfen und wenn diese einen bestimmten Wert hat den Thread beenden usw. aber ich denke nicht, dass das eine optimale und saubere Lösung ist. Kann mir jemand vielleicht ein konkretes Beispiel geben?</p>
<p>Danke!</p>
</blockquote>
<p>Was du da beschreibst kenne ich unter dem Begriff &quot;kill flag&quot;, und das ist oft die beste Lösung. Ganz einfach weil sie einfach ist und funktioniert. Gerade wenn der Worker-Thread IO macht kann man sich sowieso nicht aussuchen wann man die Checks ob man abbrechen sollte durchführt, und da ist Polling mit einem Flag oft genausogut wie irgendwelche &quot;Event Variablen&quot; o.ä.</p>
<p>Das einzige was man IMO immer machen sollte ist dieses &quot;kill flag&quot; über eine Mutex zu schützen.</p>
<p>Siehe auch hier:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1425808.html#1425808" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-p-is-1425808.html#1425808</a></p>
<p>Wenn natürlich sowieso schon irgendwie mit dem Thread kommuniziert wird kann man das &quot;kill flag&quot; einfach als zusätzliche Variable einführen, z.B. so (schematisch):</p>
<pre><code class="language-cpp">Mutex g_mutex;
Queue g_queue;
Event g_event;
bool g_killFlag;

void MyThreadFunction()
{
    for (;;)
    {
        ::WaitForSingleObject(g_event.GetHandle(), INFINITE);
        ::ResetEvent(g_event.GetHandle());
        ScopedLock l(g_mutex);
        while (g_queue.NotEmpty())
            ProcessQueueEntry(q_queue.Pop());
        if (g_killFlag)
            break;
    }
}

void SignalEnd()
{
    ScopedLock l(g_mutex);
    g_killFlag = true;
    ::SetEvent(g_event.GetHandle());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1425809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425809</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Dec 2007 06:41:45 GMT</pubDate></item></channel></rss>