<?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 in dll soll Klasseninstanz benachrichtigen]]></title><description><![CDATA[<p>Hallo liebe Programmierkollegen</p>
<p>Ich stehe bei einem weiteren Problem von mir wieder mal auf dem Schlauch und bräuchte mal eure Meinung.</p>
<p>Ich habe eine stinknormale C++ DLL, die keinerlei Verbindungen zu anderen Sprachteilen wie MFC, CLR oder ATL hat. In dieser DLL hab ich natürlich auch Funktionen, die ich exportiert habe. Da meine DLL auch einen Sinn haben soll und verschiedene Aufgaben erledigen soll, initialisiert eine dieser exportierten Funktion eine Klasse in der DLL. Innerhalb dieser Klasse wird dann ein Thread gestartet, der mir so lange läuft bis seine Endbedinung in der Klasse gesetzt wird (z.B. durch eine weitere exportierte Funktion).</p>
<pre><code class="language-cpp">class TKlasse {

private: bool terminate;
(...)

void TKlasse::cleanup() {
	//Beende Threadprozedor
	this-&gt;terminate = true;
	//Warte bis Threadprozedur beendet ist
	if (this-&gt;ThreadHandle != INVALID_HANDLE_VALUE) WaitForSingleObject(this-&gt;ThreadHandle,1000);
	this-&gt;ThreadHandle = INVALID_HANDLE_VALUE;
	//Entferne Einträge
	(*this-&gt;valmap).erase(this-&gt;devNum);
	this-&gt;devNum = 0;

}

//Execute Methode, die den Threadstart enthält
void TKlasse::execute() {
	this-&gt;terminate = false;
        this-&gt;ThreadHandle = CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)algorithm, this , 0 , &amp;dwThreadID );
	if (this-&gt;ThreadHandle == NULL) {
		//Fehlerverarbeitung
		this-&gt;ThreadHandle = INVALID_HANDLE_VALUE;
	}
}

static DWORD WINAPI TLese::algorithm(void* PTKlasse) {

     TKlasse * myTKlasse = (TKlasse*)PTKlasse;

     while (myTKlasse-&gt;terminate) {
          //do something
          if (Fehler) break;
     }
     if (myTKlasse-&gt;terminate) {
         //Trigger von innen
         //benachrichtige TKlasse
         ...
     }
     return 0;
}
}
</code></pre>
<p>cleanup() ist die Klasse die den Thread beendet und alle nötigen Aufräumarbeiten vornimmt.</p>
<p>Nun kann es aber passieren, dass mein Thread bei der Ausführung auf einen Fehler läuft (z.b. durch Einfluss des Bedieners) Dafür hab ich innerhalb der Threadausführung natürlich Prüfpunkte eingearbeitet, die im Fehlerfalle die Ausführungsschleife beenden. (vereinfacht: if (Fehler) break;) Was ich aber noch nicht habe, ist der korrekte Aufruf von Cleanup bei solch einem Fehler.<br />
Problem, welches ich sehe ist, dass wenn ich Cleanup aufrufe diese Prozedur auf das Ende des Threads wartet, der Thread aber auf die fertige Abarbeitung von Cleanup wartet. (Deadlock?) Nun dachte ich mir, ich erstelle im Thread eine einfache PostMessage die er aussendet und die dann von TKlasse verrabeitet wird, jedoch hab ich in der DLL bzw. in der Klasseninstanz ja keine Message_Map die mir die Nachricht auch empfängt und verarbeiten kann. Ich bin mir auch gar nicht sicher ob es Sinn macht, dort eine Messageverarbeitung unterzubringen.</p>
<p>Wie würdet ihr denn da rangehen? Was würdet ihr denn unternehmen, damit der Thread im Fehlerfalle sauber beendet wird, aber auch im Anschlus die Aufräumarbeiten ausgeführt werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236066/thread-in-dll-soll-klasseninstanz-benachrichtigen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 21:56:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236066.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Mar 2009 14:12:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread in dll soll Klasseninstanz benachrichtigen on Tue, 10 Mar 2009 14:12:43 GMT]]></title><description><![CDATA[<p>Hallo liebe Programmierkollegen</p>
<p>Ich stehe bei einem weiteren Problem von mir wieder mal auf dem Schlauch und bräuchte mal eure Meinung.</p>
<p>Ich habe eine stinknormale C++ DLL, die keinerlei Verbindungen zu anderen Sprachteilen wie MFC, CLR oder ATL hat. In dieser DLL hab ich natürlich auch Funktionen, die ich exportiert habe. Da meine DLL auch einen Sinn haben soll und verschiedene Aufgaben erledigen soll, initialisiert eine dieser exportierten Funktion eine Klasse in der DLL. Innerhalb dieser Klasse wird dann ein Thread gestartet, der mir so lange läuft bis seine Endbedinung in der Klasse gesetzt wird (z.B. durch eine weitere exportierte Funktion).</p>
<pre><code class="language-cpp">class TKlasse {

private: bool terminate;
(...)

void TKlasse::cleanup() {
	//Beende Threadprozedor
	this-&gt;terminate = true;
	//Warte bis Threadprozedur beendet ist
	if (this-&gt;ThreadHandle != INVALID_HANDLE_VALUE) WaitForSingleObject(this-&gt;ThreadHandle,1000);
	this-&gt;ThreadHandle = INVALID_HANDLE_VALUE;
	//Entferne Einträge
	(*this-&gt;valmap).erase(this-&gt;devNum);
	this-&gt;devNum = 0;

}

//Execute Methode, die den Threadstart enthält
void TKlasse::execute() {
	this-&gt;terminate = false;
        this-&gt;ThreadHandle = CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE)algorithm, this , 0 , &amp;dwThreadID );
	if (this-&gt;ThreadHandle == NULL) {
		//Fehlerverarbeitung
		this-&gt;ThreadHandle = INVALID_HANDLE_VALUE;
	}
}

static DWORD WINAPI TLese::algorithm(void* PTKlasse) {

     TKlasse * myTKlasse = (TKlasse*)PTKlasse;

     while (myTKlasse-&gt;terminate) {
          //do something
          if (Fehler) break;
     }
     if (myTKlasse-&gt;terminate) {
         //Trigger von innen
         //benachrichtige TKlasse
         ...
     }
     return 0;
}
}
</code></pre>
<p>cleanup() ist die Klasse die den Thread beendet und alle nötigen Aufräumarbeiten vornimmt.</p>
<p>Nun kann es aber passieren, dass mein Thread bei der Ausführung auf einen Fehler läuft (z.b. durch Einfluss des Bedieners) Dafür hab ich innerhalb der Threadausführung natürlich Prüfpunkte eingearbeitet, die im Fehlerfalle die Ausführungsschleife beenden. (vereinfacht: if (Fehler) break;) Was ich aber noch nicht habe, ist der korrekte Aufruf von Cleanup bei solch einem Fehler.<br />
Problem, welches ich sehe ist, dass wenn ich Cleanup aufrufe diese Prozedur auf das Ende des Threads wartet, der Thread aber auf die fertige Abarbeitung von Cleanup wartet. (Deadlock?) Nun dachte ich mir, ich erstelle im Thread eine einfache PostMessage die er aussendet und die dann von TKlasse verrabeitet wird, jedoch hab ich in der DLL bzw. in der Klasseninstanz ja keine Message_Map die mir die Nachricht auch empfängt und verarbeiten kann. Ich bin mir auch gar nicht sicher ob es Sinn macht, dort eine Messageverarbeitung unterzubringen.</p>
<p>Wie würdet ihr denn da rangehen? Was würdet ihr denn unternehmen, damit der Thread im Fehlerfalle sauber beendet wird, aber auch im Anschlus die Aufräumarbeiten ausgeführt werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677381</guid><dc:creator><![CDATA[daimonion]]></dc:creator><pubDate>Tue, 10 Mar 2009 14:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Thread in dll soll Klasseninstanz benachrichtigen on Tue, 10 Mar 2009 14:23:52 GMT]]></title><description><![CDATA[<p>mache die Aufräumarbeiten einfach im thread nachdem er die While schleife verlassen hat und warte bei Cleanup nur das sich der Thread beendet</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677388</guid><dc:creator><![CDATA[Destiniy]]></dc:creator><pubDate>Tue, 10 Mar 2009 14:23:52 GMT</pubDate></item><item><title><![CDATA[Reply to Thread in dll soll Klasseninstanz benachrichtigen on Tue, 10 Mar 2009 15:47:52 GMT]]></title><description><![CDATA[<p>Stimmt eigentlich. Ist vielleicht sogar die einfachste Lösung.</p>
<p>Nur als Lektion für mich:</p>
<p>Würde denn meine Idee umsetzbar sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677457</guid><dc:creator><![CDATA[daimonion]]></dc:creator><pubDate>Tue, 10 Mar 2009 15:47:52 GMT</pubDate></item></channel></rss>