<?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[recv() und ReadFile() in Extra-Thread, wie?]]></title><description><![CDATA[<p>Tag,</p>
<p>ich habe grade zwei Projekte beim einen muss ich dauernd<br />
abfrage ob ich mit recv etwas empfangen kann und beim anderen<br />
mit ReadFile (geht um ne rs232 Schnittstelle).<br />
Wie ich einen neuen Thread aufmache ist mir klar,<br />
die Frage ist nur, wie arbeite ich in dem<br />
Thread mit meinem socket / file-Handle ?<br />
Geb ich das als Referenz oder Zeiger rein?<br />
Oder doch ganz anders?</p>
<p>Danke schonmal,</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208748/recv-und-readfile-in-extra-thread-wie</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Apr 2026 21:02:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208748.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Mar 2008 11:09:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to recv() und ReadFile() in Extra-Thread, wie? on Sat, 22 Mar 2008 11:09:38 GMT]]></title><description><![CDATA[<p>Tag,</p>
<p>ich habe grade zwei Projekte beim einen muss ich dauernd<br />
abfrage ob ich mit recv etwas empfangen kann und beim anderen<br />
mit ReadFile (geht um ne rs232 Schnittstelle).<br />
Wie ich einen neuen Thread aufmache ist mir klar,<br />
die Frage ist nur, wie arbeite ich in dem<br />
Thread mit meinem socket / file-Handle ?<br />
Geb ich das als Referenz oder Zeiger rein?<br />
Oder doch ganz anders?</p>
<p>Danke schonmal,</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478639</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Sat, 22 Mar 2008 11:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to recv() und ReadFile() in Extra-Thread, wie? on Sat, 22 Mar 2008 11:12:14 GMT]]></title><description><![CDATA[<p>Zeig doch mal Code, dann lässt sich einfacher diskutieren.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478641</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 22 Mar 2008 11:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to recv() und ReadFile() in Extra-Thread, wie? on Sat, 22 Mar 2008 11:43:32 GMT]]></title><description><![CDATA[<p>Ok, momentan habe ich diesen Code hier<br />
in meinem Main-Thread:</p>
<pre><code class="language-cpp">NetworkServer* ns;
ns = new NetworkServer;
vector&lt;string&gt; msgs;
</code></pre>
<pre><code class="language-cpp">while(1)
	{
		msgs = ns-&gt;waitForMessages();

		if(ns-&gt;getLastError() != 0)
		{
			msgs.push_back(&quot;an Error appeared: &quot; + valueToString(ns-&gt;getLastError()));
			delete ns;
			break;
        }

		for(int i=0; i&lt;msgs.size(); i++)
		{
            log-&gt;Items-&gt;Add(msgs[i].c_str());
		}

		Application-&gt;ProcessMessages();
    }
</code></pre>
<p>den will ich jetzt in dieser Form in einen Thread auslagern:</p>
<pre><code class="language-cpp">while(1)
	{
		msgs = ns-&gt;waitForMessages();

		if(ns-&gt;getLastError() != 0)
		{
			Synchronize(...); // dem Main Thread die Error Nummer mitgeben
        }

		for(int i=0; i&lt;msgs.size(); i++)
		{
            Synchronize(...); // dem Main Thread die Nachrichten übermitteln
		}

		Application-&gt;ProcessMessages();
    }
</code></pre>
<p>ns ist eine Instanz meiner Klasse die das alles handelt, sie<br />
beinhaltet die Sockets etc...<br />
Die Frage ist, wie rufe ich Methoden dieser Klasse im Thread auf,<br />
also, übergebe ich die Instanz an den Thread oder muss ich alle Sockets<br />
im Thread nochmal neu aufmachen oder wie oder was.</p>
<p>Gruß,</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478664</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Sat, 22 Mar 2008 11:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to recv() und ReadFile() in Extra-Thread, wie? on Sat, 22 Mar 2008 13:13:15 GMT]]></title><description><![CDATA[<p>Übergib den NetworkServer an den Thread.<br />
Alternativ kannst Du auch den NetworkServer auch erst im Thread erstellen.</p>
<p>Dann musst Du dir überlegen, wie die Daten aus dem &quot;Receiver&quot; Thread wieder in den Main Thread kommen. Eine Möglichkeit wäre eine Queue, oder via Windows Messages. Beachte dass die Zugriffe auf Speicher (Variablen) der von beiden Threads gemeinsam genutzt wird synchronisiert werden müssen (mit Critical Sections o.ä.).</p>
<p>Achtung: Du darfst nur aus dem Thread auf UI Elemente zugreifen, der sie erstellt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478714</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 22 Mar 2008 13:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to recv() und ReadFile() in Extra-Thread, wie? on Sat, 22 Mar 2008 14:25:37 GMT]]></title><description><![CDATA[<p>simon.gysi schrieb:</p>
<blockquote>
<p>Übergib den NetworkServer an den Thread.<br />
Alternativ kannst Du auch den NetworkServer auch erst im Thread erstellen.</p>
<p>Dann musst Du dir überlegen, wie die Daten aus dem &quot;Receiver&quot; Thread wieder in den Main Thread kommen. Eine Möglichkeit wäre eine Queue, oder via Windows Messages. Beachte dass die Zugriffe auf Speicher (Variablen) der von beiden Threads gemeinsam genutzt wird synchronisiert werden müssen (mit Critical Sections o.ä.).</p>
<p>Achtung: Du darfst nur aus dem Thread auf UI Elemente zugreifen, der sie erstellt hat.</p>
</blockquote>
<p>Danke erstmal, hat schonmal sehr geholfen <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>Also den NetworkServer will ich nicht erst im Thread erstellen da ich<br />
vom Main-Thread aus Daten verschicken will.</p>
<p>Also, hätte ich vlt dazu sagen sollen, ich benutze den Borland, habs hier nur<br />
in der WinAPI da es ja um WinAPI Funktionen (recv() und ReadFile()) geht<br />
und mit dem Borland darf ich auch auf UI Elemente greifen die ich nicht<br />
erstellt habe. Auch wenn ich das garnicht will, ich dachte eigentlich<br />
das ich einen vektor mit den Nachrichten rausgebe (jedes mal wenn eben<br />
was empfangen wurde).</p>
<p>Ok, funktioniert alles <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>Wenns jemand interessiert ich machs jetzt so:</p>
<p>Thread:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
void __fastcall receiver::Execute()
{
	while(1)
	{
    	msgs.clear();
		msgs = ns-&gt;waitForMessages();

		if(ns-&gt;getLastError() != 0)
		{
			msgs.push_back(&quot;an Error occured: &quot; + valueToString(ns-&gt;getLastError()));
			Synchronize(&amp;updateMessages);
			Suspend();
			break;
		}
		Sleep(100);
		Synchronize(&amp;updateMessages);
    }
}
//---------------------------------------------------------------------------
void __fastcall receiver::updateMessages()
{
    Form1-&gt;msgs.clear();
	Form1-&gt;msgs = msgs;
}
//---------------------------------------------------------------------------
</code></pre>
<p>mit Synchronize werden die Empfangenen Daten in einen Vektor in meinem<br />
Haupt-Thread geschrieben, dort gebe ich sie dann mit einem Timer aus:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
void __fastcall TForm1::msgTimerTimer(TObject *Sender)
{
	for(int i=0; i&lt;msgs.size(); i++)
	{
        log-&gt;Items-&gt;Add(msgs[i].c_str());
	}
	msgs.clear();
}
//---------------------------------------------------------------------------
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1478721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478721</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Sat, 22 Mar 2008 14:25:37 GMT</pubDate></item></channel></rss>