<?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[Klassen-Funktion im Thread aufrufen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich will aus einer Thread-Funktion eine Klassenfunktion aufrufen.<br />
Leider klappt das nicht ganz, weil beim Aufruf der Klassenfunktion manchmal das<br />
Programm abstürzt oder die Klassenfunktion falsch ausgeführt wird.</p>
<p>Der Code sieht wie folgt aus:</p>
<pre><code class="language-cpp">clXyCity XyCity;

static DWORD WINAPI threadFunc(LPVOID data) {
    // KlassenFunktion
    XyCity.LoadObjects(-1);
}

CreateThread(NULL, 0, threadFunc, NULL, 0, 0);
</code></pre>
<p>Hab auch schon probiert die KlassenFunktion über einen Pointer aufzurufen, leider erfolglos.</p>
<p>Mfg, Pk3 <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/topic/269919/klassen-funktion-im-thread-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 13:46:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269919.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Jul 2010 17:35:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 17:41:29 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich will aus einer Thread-Funktion eine Klassenfunktion aufrufen.<br />
Leider klappt das nicht ganz, weil beim Aufruf der Klassenfunktion manchmal das<br />
Programm abstürzt oder die Klassenfunktion falsch ausgeführt wird.</p>
<p>Der Code sieht wie folgt aus:</p>
<pre><code class="language-cpp">clXyCity XyCity;

static DWORD WINAPI threadFunc(LPVOID data) {
    // KlassenFunktion
    XyCity.LoadObjects(-1);
}

CreateThread(NULL, 0, threadFunc, NULL, 0, 0);
</code></pre>
<p>Hab auch schon probiert die KlassenFunktion über einen Pointer aufzurufen, leider erfolglos.</p>
<p>Mfg, Pk3 <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/1920884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920884</guid><dc:creator><![CDATA[Pk3]]></dc:creator><pubDate>Sat, 03 Jul 2010 17:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 18:34:11 GMT]]></title><description><![CDATA[<p>Ups... Sorry...</p>
<p>Das war wohl nicht passend</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920894</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 03 Jul 2010 18:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 19:20:07 GMT]]></title><description><![CDATA[<p>Abgesehen dass es schrecklich ist, die globale Variable zu haben...</p>
<p>Wann rufst Du CreateThread(..) auf? Ist da dein Objekt schon erzeugt?</p>
<p>Und CloseHandle(..) nach dem CreateThread(..) nicht vergessen.</p>
<p>Ausserdem: Warum machst Du nicht im Konstruktor deiner Klasse einen eigenen Thread? Sozusagen ein aktives Objekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920903</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 03 Jul 2010 19:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 19:29:55 GMT]]></title><description><![CDATA[<p>Pk3 schrieb:</p>
<blockquote>
<p>weil beim Aufruf der Klassenfunktion manchmal das<br />
Programm abstürzt</p>
</blockquote>
<p>Das liegt dann wohl am Programm. Rufst du Funktionen von XyCity aus mehreren Threads auf?</p>
<blockquote>
<p>oder die Klassenfunktion falsch ausgeführt wird.</p>
</blockquote>
<p>Falsch? Wie &quot;falsch&quot;?</p>
<p>P.S.: Zeilenumbruch kann das Forum auch allein, ohne deine Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920907</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sat, 03 Jul 2010 19:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 19:45:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19131">@theta</a><br />
CreateThread wird in der Main - Funktion aufgerufen und das Objekt ist da schon erzeugt bevor der Thread startet. Hab jetzt auch CloseHandle danach gemacht.</p>
<blockquote>
<p>Ausserdem: Warum machst Du nicht im Konstruktor deiner Klasse einen eigenen Thread? Sozusagen ein aktives Objekt?</p>
</blockquote>
<p>Koennte ich auch machen, aber so muss es doch auch funktionieren, oder <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24923">@Nukularfüsiker</a><br />
Ne, die Funktion wird nur in diesen einen Thread aufgerufen. Und das es abstürtzt, liegt definitiv am Thread. Habs ausprobiert in dem ich den Aufruf der Klassenfunktion in die Mainfunktion gemacht habe, da kam kein crash oder &quot;Fehler&quot;. Mit den Fehlern mein ich, das der da keine Texturen für die Objekte ladet, sehr komisch, keine Ahnung was da genau net richtig funktioniert.</p>
<blockquote>
<p>P.S.: Zeilenumbruch kann das Forum auch allein, ohne deine Hilfe.</p>
</blockquote>
<p>Ja dumme Angewohnheit, sorry :D.</p>
<p>Mfg, Pk3</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920915</guid><dc:creator><![CDATA[Pk3]]></dc:creator><pubDate>Sat, 03 Jul 2010 19:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 20:02:34 GMT]]></title><description><![CDATA[<p>Was sagt denn der Debugger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920919</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sat, 03 Jul 2010 20:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sat, 03 Jul 2010 21:07:01 GMT]]></title><description><![CDATA[<p>Pk3 schrieb:</p>
<blockquote>
<p>Ne, die Funktion wird nur in diesen einen Thread aufgerufen.</p>
</blockquote>
<p>Es ging aber nicht (nur) um diese Funktion, sondern das Objekt! Wenn du auf ein Objekt lesend zugreifst, während ein anderer Thread zeitgleich schreibend darauf zugreift, hast du gute Chancen, dass der lesende Müll bekommt. Oder lass mehrere gleichzeitig schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
(schreiben == Objekt verändern, lesen == Werte beim Objekt erfragen).<br />
Lösung: Zugriffe mit Mutexen synchronisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920952</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 03 Jul 2010 21:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sun, 04 Jul 2010 08:37:14 GMT]]></title><description><![CDATA[<p>Auf das Objekt wird nirgentwo zugegriffen auser im Thread.<br />
Hier mal zur Verdeutlichung:</p>
<pre><code class="language-cpp">int texId;

class clXyCity {
    public:
        stPlayer Player[MAX_PLAYERS];
        long myBrushId;
        bool bRefreshMyEntity;

        void LoadObjects(int sec) {
		.... Code ...

		int texId=Render.LoadTexture(filename);

		printf(&quot;[THREAD] Texture-Id: %i, Texture-Name: %s\n&quot;, texId, Render.Image[texId].name);

		... Code ...
	}

	...
};

...

clXyCity XyCity;

static DWORD WINAPI threadFunc(LPVOID data) {
    // KlassenFunktion
    XyCity.LoadObjects(-1);
}

int main() {
	texId = -2;
	HANDLE hThrd=CreateThread(NULL, 0, threadFunc, NULL, 0, 0);
	CloseHandle(hThrd);

	while(1) {
		// Warten bis texId nicht mehr &quot;-2&quot; ist (bis die Texture geladen wurde)
		if(texId != -2) {
			// Texture - Infos ausgeben
			printf(&quot;[MAIN] Texture-Id: %i, Texture-Name: %s\n&quot;, texId, Render.Image[texId].name);
texId=-2;
		}

		Sleep(5);
	}
}
</code></pre>
<p>Es scheint so, als ob der Fehler be OpenGL liegt, weil alle Textur - Daten in der Main - Funktion lesbar sind, auch die Pixeldaten.</p>
<p>Hier die LoadTexture - Funktion:</p>
<pre><code class="language-cpp">int clRender::LoadTexture(char *strFile) {
    int slotId;
    char typ[256];
    slotId = GetFreeTextureSlot();
    if(slotId != -1) {

        memset(typ, 0, 256);
        File.GetFileTyp(strFile, typ);

        if(strcmp(typ, &quot;.bmp&quot;) == 0) {
                if(File.Exist(strFile) == true) {
                    Image[slotId].auxTex=auxDIBImageLoad(strFile);
                }
                else {
                    return -1;
                }

                if(Image[slotId].auxTex != NULL) {
                    Image[slotId].lock = 1;
		    strcpy(Image[slotId].name, strFile);

                    glGenTextures(1, &amp;Image[slotId].tex);
                    glBindTexture(GL_TEXTURE_2D, Image[slotId].tex);

                    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
                    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
                    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
                    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
                    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

                    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Image[slotId].auxTex-&gt;sizeX, Image[slotId].auxTex-&gt;sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image[slotId].auxTex-&gt;data);
                }
                else {
                    return -1;
                }
        }
    }
    return slotId;
}
</code></pre>
<p>Wenn die Textur jetzt auf ein Objekt gelegt wird, ist das Objekt weiß, also keine Textur. Kann es sein, das einer dieser OpenGL - Funktionen im Thread nicht funktionieren? Oder hab ich da was falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921045</guid><dc:creator><![CDATA[Pk3]]></dc:creator><pubDate>Sun, 04 Jul 2010 08:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sun, 04 Jul 2010 09:00:12 GMT]]></title><description><![CDATA[<p>Pk3 schrieb:</p>
<blockquote>
<p>Kann es sein, das einer dieser OpenGL - Funktionen im Thread nicht funktionieren?</p>
</blockquote>
<p>Das stünde dann in der Dokumentation, die du ja bestimmt gelesen hast.</p>
<blockquote>
<p>Oder hab ich da was falsch gemacht?</p>
</blockquote>
<p>Bezüglich deines Problems: Ein paar Fehlerprüfungen im Code könnten nützlich sein.<br />
Weißt du was ein Debugger ist?</p>
<p>Ansonsten: hässlichster C-mit-Klassen-Code seit langem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921050</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sun, 04 Jul 2010 09:00:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Sun, 04 Jul 2010 14:06:52 GMT]]></title><description><![CDATA[<p>Du benutzt Render in zwei Threads, ohne die Zugriffe zu synchronisieren. Wann und wo das globale texId gesetzt wird, kann ich deinem Code nicht entnehmen (in LoadObjects gibt's eine lokal definierte Version), aber auch der Zugriff ist wohl nicht synchronisiert.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921170</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 04 Jul 2010 14:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Wed, 07 Jul 2010 12:33:17 GMT]]></title><description><![CDATA[<p>Das Problem lag allein an einer OpenGL - Funktion die nicht threadsicher war.<br />
Habs geloest in dem ich die OpenGL - Funktion in die Main - Funktion gemacht habe und diese über eine Variable (BOOL) über den Thread aurufen kann.</p>
<p>Trotzdem vielen Danke ;)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922705</guid><dc:creator><![CDATA[Pk3]]></dc:creator><pubDate>Wed, 07 Jul 2010 12:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Funktion im Thread aufrufen on Wed, 07 Jul 2010 14:36:10 GMT]]></title><description><![CDATA[<p>Pk3 schrieb:</p>
<blockquote>
<p>Das Problem lag allein an einer OpenGL - Funktion die nicht threadsicher war.<br />
Habs geloest in dem ich die OpenGL - Funktion in die Main - Funktion gemacht habe und diese über eine Variable (BOOL) über den Thread aurufen kann.</p>
</blockquote>
<p>Ich verstehe deine Erklärung nicht genau (sind das Gedanken- oder Bindestriche?), aber zur Threadsynchronisation benutzt man Mutexes, Semaphoren oder Critical Sections. Anderes Gefrickel wird dir früher oder später um die Ohren fliegen. Garantiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1922773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1922773</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Wed, 07 Jul 2010 14:36:10 GMT</pubDate></item></channel></rss>