<?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[Mögliche Datenkorruption bei Beenden während gespeichert wird...]]></title><description><![CDATA[<p>Hey!</p>
<p>Folgendes interessiert mich sehr:<br />
Nehmen wir an, ich erstelle einen Thread (Neben dem Hauptthread, den man ja nicht selbst erstellen muss) und lasse dort Daten in eine Datei speichern.<br />
Nun klickt der Benutzer aber im Moment der Speicherung auf &quot;X&quot; und das Programm beendet. Wird nun der Thread sofort terminiert und die Datei ist korrupt, also die Speicherung nicht zu ende geführt worden?<br />
Wie verhindere ich das bei _beginthread() oder CreateThread()? Bitte für beide Funktionen Tipps geben.</p>
<p>(Es handelt sich um eine Windows-Anwendung, daher läuft die Nachrichtenschleife u.a. für das beendende &quot;X&quot; in einem separaten Thread, daher bin ich mir ziemlich sicher, dass ich da eine Wartefunktion einbauen muss)</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203255/mögliche-datenkorruption-bei-beenden-während-gespeichert-wird</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 10:20:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203255.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Jan 2008 22:50:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Sun, 20 Jan 2008 22:50:12 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Folgendes interessiert mich sehr:<br />
Nehmen wir an, ich erstelle einen Thread (Neben dem Hauptthread, den man ja nicht selbst erstellen muss) und lasse dort Daten in eine Datei speichern.<br />
Nun klickt der Benutzer aber im Moment der Speicherung auf &quot;X&quot; und das Programm beendet. Wird nun der Thread sofort terminiert und die Datei ist korrupt, also die Speicherung nicht zu ende geführt worden?<br />
Wie verhindere ich das bei _beginthread() oder CreateThread()? Bitte für beide Funktionen Tipps geben.</p>
<p>(Es handelt sich um eine Windows-Anwendung, daher läuft die Nachrichtenschleife u.a. für das beendende &quot;X&quot; in einem separaten Thread, daher bin ich mir ziemlich sicher, dass ich da eine Wartefunktion einbauen muss)</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440236</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Sun, 20 Jan 2008 22:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Sun, 20 Jan 2008 23:02:21 GMT]]></title><description><![CDATA[<p>Dann mache das doch mit der Warte-Funktion!<br />
Im übrigen, beginthread verwendet CreateThread, um Windows zu sagen, dass ein Threadobjekt zu erstellen ist. Also von daher, kann schonmal und existiert auch nur ein kleiner Unterschied, Stichwort CRT bei beginthread.</p>
<p>Erstelle doch eine globale Variable (meinetwegen bDontExit) und vor dem Thread-Start setzt du diese auf true, wenn dann der User das Programm beenden will und bDontExit auf true steht, startest du einem Timer, der alle x Millisekunden überprüft, ob bDontExit auf false steht und wenn ja, das Programm schließt. Wenn der Nebenthread mit den Dateien fertig ist und das Programm ansich geschloßen werden kann, setzt du die Variable auf false und das Programm wird beendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440243</guid><dc:creator><![CDATA[Fake oder Echt]]></dc:creator><pubDate>Sun, 20 Jan 2008 23:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Sun, 20 Jan 2008 23:12:32 GMT]]></title><description><![CDATA[<p>Hm ok aber es ist doch so einfacher:</p>
<pre><code class="language-cpp">if(threadHandle)
		WaitForSingleObject(threadHandle, 10000);

	PostQuitMessage(0);
</code></pre>
<p>Aber was ist, wenn die Abfrage zwar TRUE ist, dann aber zum anderen Thread gewechselt wird, dieser fertig wird und dann WaitForSingleObject() für einen Thread aufgerufen wird, der nicht mehr existiert? Laut MSDN undefiniertes Verhalten.</p>
<p>Muss ich mich da jetzt in verschiedensten Thread-Techniken einlernen, oder geht das einfacher/sicherer?</p>
<p>Und wie ist das eigentlich mit WaitForSingleObject(), wird da aufgehört zu warten, wenn der Zielthread returned?</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440248</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Sun, 20 Jan 2008 23:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Sun, 20 Jan 2008 23:23:28 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Nun klickt der Benutzer aber im Moment der Speicherung auf &quot;X&quot; und das Programm beendet. Wird nun der Thread sofort terminiert und die Datei ist korrupt, also die Speicherung nicht zu ende geführt worden?</p>
</blockquote>
<p>Wir sind hier zum Glück nicht im Winapi-Forum (wo deine Frage hingehört hätte), deshalb darf ich auch mal halbwissend herumdilettieren: Das Klick auf das X führt dazu, dass der Prozess eine Nachricht empfängt, die ihn dazu auffordert, sich zu beenden. Ob und wie er das tut -- vorzugsweise in einer Form, die keine Daten korrumpiert, ist ihm überlassen. Das OS schießt nicht einfach so Threads ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440255</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 20 Jan 2008 23:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 08:03:15 GMT]]></title><description><![CDATA[<p>Kannst ja einen eigenen Signal-Handler schreiben. Das schlimmste was passieren könnte ist das dein Programm zu lange braucht dann und Windows die altbekannte &quot;Programm reagiert nicht&quot;-Meldung wirft und der Prozess dann vom User abgeschossen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440313</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 21 Jan 2008 08:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 09:00:55 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-4.html" rel="nofollow">WinAPI</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/1440362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440362</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 21 Jan 2008 09:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 10:26:46 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Hm ok aber es ist doch so einfacher:</p>
<pre><code class="language-cpp">if(threadHandle)
		WaitForSingleObject(threadHandle, 10000);

	PostQuitMessage(0);
</code></pre>
<p>Aber was ist, wenn die Abfrage zwar TRUE ist, dann aber zum anderen Thread gewechselt wird, dieser fertig wird und dann WaitForSingleObject() für einen Thread aufgerufen wird, der nicht mehr existiert? Laut MSDN undefiniertes Verhalten.</p>
</blockquote>
<p>Solange Du ein gültiges Handle hast, (CloseHandle nicht aufgerufen) kannst Du immer wieder das Handle benutzen. Also auch für WaitForSingleObject.</p>
<p>Du solltestin solch einem Fall immer WaitForSingleObject(threadHandle, INFINITE); Es könnte ja sein, dass es länger als 10 Sekunden dauert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440440</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 21 Jan 2008 10:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 14:31:05 GMT]]></title><description><![CDATA[<p>Ok danke, in meinem Fall dauert das Speichern immer unter einer Sekunde, also lass ich das timeout bei 5000.</p>
<p>Danke danke,<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440647</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Mon, 21 Jan 2008 14:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 17:17:49 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Ok danke, in meinem Fall dauert das Speichern immer unter einer Sekunde, also lass ich das timeout bei 5000.</p>
<p>Danke danke,<br />
MfG</p>
</blockquote>
<p>Das ist Quark. Warte einfach bis der Thread terminiert! Warum willst Du ein Timeout? Setze INFINITE!<br />
Es kann sehr wohl länger dauern als 5 Sekunden, wenn z.B. ein Shutdown erfolgt und auf einmal alle Programm schreiben wollen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440791</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 21 Jan 2008 17:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 20:03:31 GMT]]></title><description><![CDATA[<p>Ok daran habe ich nicht gedacht! Wenn ich nun drüber nachdenke, ist INFINITE eh besser, denn wenn der Thread nicht beendet, stimmt ja was nicht.<br />
Danke dir!</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440895</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Mon, 21 Jan 2008 20:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to Mögliche Datenkorruption bei Beenden während gespeichert wird... on Mon, 21 Jan 2008 22:03:03 GMT]]></title><description><![CDATA[<p>BTW: wenn du _beginthread() verwendest, dann wird das Handle ungültig sobald der Thread terminiert (bzw. genaugenommen: kurz vorher). WaitForSingleObject mit einem Handle welches von _beginthread() gekommen ist ist daher immer ein Fehler!<br />
Verhindern tust du das indem du entweder CreateThread oder gleich (besser) _begintrheadex verwendest - die beiden Funktionen lassen das Handle nämlich leben solange bis du es selbst schliesst.</p>
<p>Und ob du einfach in der WindowProc (bzw. im OnClose Handler) auf den Speicher-Thread warten kannst hängt davon ab ob der Speicher-Thread davon abhängig ist dass der Haupt-Thread noch Nachrichten verarbeitet. Wenn der Speicher-Thread Funktionen wie SendMessage verwendet ist davon auszugehen dass er den Haupt-Thread braucht. In dem Fall musst du WM_CLOSE anders implementieren, z.B. indem du falls der Speicher-Thread noch lebt sämtliche Child-Fenster disablest, und dann einen &quot;close timer&quot; setzt.<br />
In dem &quot;close timer&quot; kannst du dann pollen ob der Speicher-Thread schon fertig ist, und sobald er es ist dann z.B. einfach nochmal selbst ein WM_CLOSE posten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440965</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 21 Jan 2008 22:03:03 GMT</pubDate></item></channel></rss>