<?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[Vollständige Funktionsabarbeitung erzwingen]]></title><description><![CDATA[<p>Hi Fans,</p>
<p>ich habe mit VC++ 7 eine DLL geschmiedet, die per serieller Kommunikation Daten von einem Controller abholt. Die Host-Anwendung, die ich nicht Debuggen kann, ruft 3 Funktionen auf:</p>
<p>1. Create(): Kommunikationsblock (Client-Objekt) erzeugen, Serielle Verbindung herstellen<br />
2. Communicate(): Daten über den Kommunikationsblock zyklisch schreiben/lesen<br />
3. Destroy(): Kommunikationsblock zerstören, Kommunikation beenden</p>
<p>Starten und Daten holen funktioniert soweit, stoppen aber nicht:</p>
<p>Communicate() wird in 99% der Fälle in der Hälfte beim Stoppen durch Destroy() unterbrochen. D.h. der Block mit den Schreib/Lesedaten wird zerstört und die Verbindung zum Controller gekappt. Danach wird versucht, die andere Hälfte von Communicate() auszuführen. Deht ja nicht, da Block schon weg -&gt; Exception() -&gt; Hostanwendung wird sofort terminiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Jetzt hab ich schon probiert mit CCriticalSection() den kritischen Abschnitt innerhalbt von Communicate() zu zementieren. Leider wird die Funktion immer noch unterbrochen.</p>
<p>Ich bin mit meinem Latein am Ende.</p>
<p>Tipps <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>MfG F98.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136364/vollständige-funktionsabarbeitung-erzwingen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 03:07:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136364.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Feb 2006 14:19:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Thu, 09 Feb 2006 14:19:12 GMT]]></title><description><![CDATA[<p>Hi Fans,</p>
<p>ich habe mit VC++ 7 eine DLL geschmiedet, die per serieller Kommunikation Daten von einem Controller abholt. Die Host-Anwendung, die ich nicht Debuggen kann, ruft 3 Funktionen auf:</p>
<p>1. Create(): Kommunikationsblock (Client-Objekt) erzeugen, Serielle Verbindung herstellen<br />
2. Communicate(): Daten über den Kommunikationsblock zyklisch schreiben/lesen<br />
3. Destroy(): Kommunikationsblock zerstören, Kommunikation beenden</p>
<p>Starten und Daten holen funktioniert soweit, stoppen aber nicht:</p>
<p>Communicate() wird in 99% der Fälle in der Hälfte beim Stoppen durch Destroy() unterbrochen. D.h. der Block mit den Schreib/Lesedaten wird zerstört und die Verbindung zum Controller gekappt. Danach wird versucht, die andere Hälfte von Communicate() auszuführen. Deht ja nicht, da Block schon weg -&gt; Exception() -&gt; Hostanwendung wird sofort terminiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Jetzt hab ich schon probiert mit CCriticalSection() den kritischen Abschnitt innerhalbt von Communicate() zu zementieren. Leider wird die Funktion immer noch unterbrochen.</p>
<p>Ich bin mit meinem Latein am Ende.</p>
<p>Tipps <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>MfG F98.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990155</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 09 Feb 2006 14:19:12 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Thu, 09 Feb 2006 14:30:39 GMT]]></title><description><![CDATA[<p>Du benötigst (vermutlich) eine CCriticalSection, auf die alle deine Funktionen zugreifen können. Und dann sollte auch die Destroy()-Funktion diese CritSec locken, bevor sie sich um die Aufräumarbeiten kümmert:</p>
<pre><code class="language-cpp">CCriticalSection m_lock;

void Communicate()
{
  m_lock.Lock();
  ... // gesicherter Bereich
  m_lock.Unlock();
}

void Destroy()
{
  m_lock.Lock();
  ... // Aufräumarbeiten
  m_lock.Unlock();
}
</code></pre>
<p>(Auf die Weise warten beide Funktionen, bis der jeweilige Partner fertig ist mit Arbeiten, bevor sie sich um ihren Kram kümmern können)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990169</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Thu, 09 Feb 2006 14:30:39 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Thu, 09 Feb 2006 16:14:11 GMT]]></title><description><![CDATA[<p>Ist es dabei egal, ob die CriticalSection innerhalb oder außerhalb der Klasse definiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990231</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 09 Feb 2006 16:14:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Fri, 10 Feb 2006 08:13:27 GMT]]></title><description><![CDATA[<p>Kommt darauf an, wie genau du die Arbeit synchronisieren willst:<br />
eine extern (oder static) definierte Critical Section gilt für alle Objekte deiner Klasse (d.h. nur eins gleichzeitig kann sich in Communicate() oder Destroy() aufhalten) - nützlich wenn alle deine Objekte mit den selben Ressourcen arbeiten wollen.<br />
eine Critical Section im Objekt gilt für jedes Objekt einzeln (Communicate()-Aufrufe von einem zweiten Objekt werden nicht beeinflußt) - das ist praktischer, wenn jedes Objekt seinen eigenen Speiicherbereich verwaltet und nur die Aufrufe intern synchronisieren will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990626</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Fri, 10 Feb 2006 08:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Fri, 10 Feb 2006 08:55:11 GMT]]></title><description><![CDATA[<p>Vielen Dank für Deine Hilfe, hat mir weitergeholfen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/990657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990657</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Fri, 10 Feb 2006 08:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Tue, 14 Feb 2006 09:58:44 GMT]]></title><description><![CDATA[<p>Neue wundersame Dinge sind geschehen:</p>
<p>Wie aus heiterem Himmel funktioniert das Locken nicht mehr korrekt. Ich habe die CCriticalSection genauso wie folgt verwendet:</p>
<pre><code class="language-cpp">CCriticalSection m_lock;

void Communicate()
{
  m_lock.Lock();

  ... // gesicherter Bereich

  m_lock.Unlock();
}

void Destroy()
{
  m_lock.Lock(); // Absturz

  ... // Aufräumarbeiten

  m_lock.Unlock();
}
</code></pre>
<p>Jetzt ist es aber so, dass wenn ich Destroy() aufrufe und m_lock.Lock(); aufgerufen wird es zum Absturz kommt. m_lock scheint also nicht mehr vorhanden zu sein, obwohl es statisch erzeugt wurde und die DLL noch nicht entladen worden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993742</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Tue, 14 Feb 2006 09:58:44 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Wed, 15 Feb 2006 07:26:35 GMT]]></title><description><![CDATA[<p>*ping*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/994481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/994481</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Wed, 15 Feb 2006 07:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Wed, 15 Feb 2006 08:07:59 GMT]]></title><description><![CDATA[<p>*pong* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>&quot;Absturz&quot; ist ein ziemlich weitreichender Begriff - wie genau äußert sich &quot;kommt es zum Absturz&quot;? (ASSERT? Zugriffsverletzung? wasweiß ich?)</p>
<p>Und du solltest das Programm mal durch den Debugger jagen, um einen genaueren Überblick über die Abläufe zu bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/994504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/994504</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 15 Feb 2006 08:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Wed, 15 Feb 2006 08:15:52 GMT]]></title><description><![CDATA[<p>Wozu die Ciritical Section? Da wäre es doch sauberer ein Event Handle zu erzeugen und im Destroy-Fall darauf zu warten. (WaitForSingleObject). Damit hat man nämlich auch gleich einen maximalen Timeout den Communicate ihrem Treiben weiter fröhnen kann, bevor sie abgemurkst wird, und es besteht zu 100% (egal was Communicate jemals macht) kein Deadlock. Bei der Critical Section halte ich das durchaus für Kritisch....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/994508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/994508</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 15 Feb 2006 08:15:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Wed, 15 Feb 2006 12:28:29 GMT]]></title><description><![CDATA[<p>Die Sache sieht so aus: Communicate() läuft vollständig durch und springt mit return raus. Danach erfolgt sofort der Aufruf von Destroy(), wo als erstes m_lock.Lock() drinsteht. Dort habe ich einem Breakpoint. Wenn ich mit F10 weiterspringe stürzt die Anwendung ab. Im Debugfenster wird ca. 6*10^23 mal</p>
<pre><code>Eine Ausnahme (erste Chance) bei 0x00234a86 in warwin.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x0000000c.
</code></pre>
<p>ausgegeben, und zwar solange, bis</p>
<pre><code>Eine Ausnahme (erste Chance) bei 0x778acbb8 in warwin.exe: 0xC00000FD: Stack overflow.
</code></pre>
<p>kommt. Und dann geht der Debugger in die Disassembly und das war's dann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/994753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/994753</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Wed, 15 Feb 2006 12:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Wed, 15 Feb 2006 16:05:52 GMT]]></title><description><![CDATA[<p>F98 schrieb:</p>
<blockquote>
<p>Die Sache sieht so aus: Communicate() läuft vollständig durch und springt mit return raus.</p>
</blockquote>
<p>Nach dem Unlock hoff ich doch?</p>
<p>Was ist mit meinem obigen Vorschlag?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/995050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/995050</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 15 Feb 2006 16:05:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Thu, 16 Feb 2006 08:43:39 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>F98 schrieb:</p>
<blockquote>
<p>Die Sache sieht so aus: Communicate() läuft vollständig durch und springt mit return raus.</p>
</blockquote>
<p>Nach dem Unlock hoff ich doch?</p>
</blockquote>
<p>Selbstverfreilich.</p>
<p>Wie geht das mit dem Event Handle? Hab ich, glaube ich, noch nie programmiert sowas.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/995483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/995483</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 16 Feb 2006 08:43:39 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Thu, 16 Feb 2006 15:20:22 GMT]]></title><description><![CDATA[<p>CreateEvent<br />
WaitForSingleObject<br />
SetEvent<br />
ResetEvent<br />
CloseEvent</p>
<p>sind da wohl die passenden Funktionen die es sich mal zu gemüte zu führen lohnt (o:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/995901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/995901</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Thu, 16 Feb 2006 15:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Fri, 17 Feb 2006 07:45:58 GMT]]></title><description><![CDATA[<p>Tue ich mir mal angucken. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/996383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/996383</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Fri, 17 Feb 2006 07:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vollständige Funktionsabarbeitung erzwingen on Wed, 04 Oct 2006 15:02:21 GMT]]></title><description><![CDATA[<p>Eine CriticalSection muss erst initialisiert werden, bevor sie benutzt werden kann. Falls du vielleicht gar nichts über CriticalSections weißt, solltest du dir genau zumindest die Hilfe dazu durchlesen. Verwende lieber EnterCriticalSection und LeaveCriticalSection sowie was du sonst an Funktionen dazu brauchen könntest. Lock und Unlock ist nicht so sauber wie es auf den ersten Blick aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1149327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1149327</guid><dc:creator><![CDATA[priesterchen]]></dc:creator><pubDate>Wed, 04 Oct 2006 15:02:21 GMT</pubDate></item></channel></rss>