<?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[CAsyncSocket in einem Thread]]></title><description><![CDATA[<p>Ich möchte eine Socketverbindung in einem Client aufbauen. Stelle ich die Verbindung im normalen Hauptthread in dem meine Dialog läuft, funktioniert es einwandfrei. (Habe da einen Button wenn der angeklickt wird wird die Verbindung aufgebaut).</p>
<p>Jetzt will ich aber in einem eigenen Thread diese Verbindung aufbauen, da ich z.b. erst bei bestimmten ereignissen oder nach einer gewissen Zeit dies machen will. In dem fall kann ich ganz normal die Verbindung aufbauen, es werden dann aber keine Funktionen der von CAsyncSocket abgeleiteten Klasse aufgerufen (OnConnect, OnReceive) so das ich keine Daten empfangen kann. Ich glaube das da irgendwas mit der initalisierung nicht stimmt.</p>
<p>Hier paar Codeausschnitte:</p>
<pre><code class="language-cpp">//Hier der Verbindungsaufbau
Server = new CMySocket(this);
if(!Server-&gt;Create())
    m_pWnd-&gt;Log.write(LOG_ERROR,&quot;Server-Socket konnte nicht aufgebaut werden&quot;);
if(!Server-&gt;Connect(m_pWnd-&gt;gData.getSIP(),m_pWnd-&gt;gData.getSPort()) &amp;&amp; (error = Server-&gt;GetLastError()) !=10035){    
    char msg[255];
    sprintf(msg,&quot;Fehler beim Server-Verbindungsaufbau: %i&quot;,error);        
    m_pWnd-&gt;Log.write(LOG_ERROR,msg); //Schreibt fehler in eine LogDatei
}
</code></pre>
<pre><code class="language-cpp">//CMySocket ist von CAsyncSocket abgeleitet und dort habe ich die Methoden OnConnect usw. überladen.
protected:
virtual void OnSend(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnClose(int nErrorCode);    
virtual void OnConnect(int nErrorCode);    
virtual void OnAccept(int nErrorCode);
</code></pre>
<pre><code class="language-cpp">//Und hier z.b die OnConnect
void CMySocket::OnConnect(int nErrorCode){    
// Sind Fehler aufgetreten?   
if (nErrorCode == 0)        
// Nein, OnConnect-Funktion des Dialogfelds aufrufen
        m_pWnd-&gt;OnConnect(this);
else m_pWnd-&gt;OnError(nErrorCode);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/71254/casyncsocket-in-einem-thread</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 19:05:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/71254.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Apr 2004 11:39:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Fri, 16 Apr 2004 11:39:07 GMT]]></title><description><![CDATA[<p>Ich möchte eine Socketverbindung in einem Client aufbauen. Stelle ich die Verbindung im normalen Hauptthread in dem meine Dialog läuft, funktioniert es einwandfrei. (Habe da einen Button wenn der angeklickt wird wird die Verbindung aufgebaut).</p>
<p>Jetzt will ich aber in einem eigenen Thread diese Verbindung aufbauen, da ich z.b. erst bei bestimmten ereignissen oder nach einer gewissen Zeit dies machen will. In dem fall kann ich ganz normal die Verbindung aufbauen, es werden dann aber keine Funktionen der von CAsyncSocket abgeleiteten Klasse aufgerufen (OnConnect, OnReceive) so das ich keine Daten empfangen kann. Ich glaube das da irgendwas mit der initalisierung nicht stimmt.</p>
<p>Hier paar Codeausschnitte:</p>
<pre><code class="language-cpp">//Hier der Verbindungsaufbau
Server = new CMySocket(this);
if(!Server-&gt;Create())
    m_pWnd-&gt;Log.write(LOG_ERROR,&quot;Server-Socket konnte nicht aufgebaut werden&quot;);
if(!Server-&gt;Connect(m_pWnd-&gt;gData.getSIP(),m_pWnd-&gt;gData.getSPort()) &amp;&amp; (error = Server-&gt;GetLastError()) !=10035){    
    char msg[255];
    sprintf(msg,&quot;Fehler beim Server-Verbindungsaufbau: %i&quot;,error);        
    m_pWnd-&gt;Log.write(LOG_ERROR,msg); //Schreibt fehler in eine LogDatei
}
</code></pre>
<pre><code class="language-cpp">//CMySocket ist von CAsyncSocket abgeleitet und dort habe ich die Methoden OnConnect usw. überladen.
protected:
virtual void OnSend(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnClose(int nErrorCode);    
virtual void OnConnect(int nErrorCode);    
virtual void OnAccept(int nErrorCode);
</code></pre>
<pre><code class="language-cpp">//Und hier z.b die OnConnect
void CMySocket::OnConnect(int nErrorCode){    
// Sind Fehler aufgetreten?   
if (nErrorCode == 0)        
// Nein, OnConnect-Funktion des Dialogfelds aufrufen
        m_pWnd-&gt;OnConnect(this);
else m_pWnd-&gt;OnError(nErrorCode);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/502616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/502616</guid><dc:creator><![CDATA[igE]]></dc:creator><pubDate>Fri, 16 Apr 2004 11:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Fri, 16 Apr 2004 17:20:29 GMT]]></title><description><![CDATA[<p>versuchs mal so:</p>
<pre><code class="language-cpp">CSocket Socket;            // die von ASyncSocket abgeleitete klasse
Socket.SetParent(this);

m_Socket.Create();
m_Socket.Connect(cVerb_SvrAdress, iVerb_Port);
</code></pre>
<p>du übergibst die funktionen OnConnect u.s.w an deine hauptdialogfeldklasse. vermute du hast das beispiel aus dem buch genommen. wenn ich mich nicht irre sind die funktionen die deine socketklasse aufruft (im hauptdialog) nicht public, oder !? mach die auch noch public.</p>
<p>bei mir klappts ja schließlich auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/502836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/502836</guid><dc:creator><![CDATA[Red Skall]]></dc:creator><pubDate>Fri, 16 Apr 2004 17:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Fri, 16 Apr 2004 18:17:05 GMT]]></title><description><![CDATA[<p>Ich habe den Konstruktor überladen so das ich die SetParent-Methode nicht aufrufen muss, weil ich dem Konstruktor schon den Parent mitgebe. Ausserdem sind die überladenen Klassen doch auch protected also ist es doch in Ordnung wenn ich die OnConnect usw. in der MySocket auch protected mache, oder?</p>
<p>Er geht gar nicht in die OnConnect von MySocket rein, also kann es nicht an der OnConnect von der Vaterklasse liegen.</p>
<p>Ich habe ja den starken Verdacht das wenn ich in einem Thread die Connect-Funktion von der CAsyncSocket aufrufe, der nicht richtig initalisiert wird und deshalb auch nicht die OnConnect aufgerufen werden. Aber wie mache ich das, das es richtig initalisiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/502864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/502864</guid><dc:creator><![CDATA[igE]]></dc:creator><pubDate>Fri, 16 Apr 2004 18:17:05 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Sat, 17 Apr 2004 10:04:29 GMT]]></title><description><![CDATA[<p>igE schrieb:</p>
<blockquote>
<p>Ich habe den Konstruktor überladen</p>
</blockquote>
<p>stimmt, hab nicht richtig hingeguckt, sry.</p>
<p>ich könnte mir vorstellen das es am thread liegt. ich hab auch schon einiges versucht im thread zu machen, aber das klappt e nicht wirklich. aber in der hauptdialogfeldklasse ging es.</p>
<p>das letzte was ich versuchen würde ist von der threadklasse aus auf die dialogfeldklasse gehen und da ne funktion aufrufen in der du deinen socket initialisierst, verstehste !?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503124</guid><dc:creator><![CDATA[Red Skall]]></dc:creator><pubDate>Sat, 17 Apr 2004 10:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Sat, 17 Apr 2004 18:23:54 GMT]]></title><description><![CDATA[<p>Habe gerade leider den Code nicht (am Montag wieder)<br />
Aber ich rufe aus der Threadfunktion eine Methode einer Klasse auf die für die Kommunikation zuständig ist. Diese Funktion hat eine Endlosschleife. In der Öffne ich auftreten von einem Ereignis die Socketverbindung. Aber das geht leider nicht. Aber warum bloss.<br />
Kann am Montag den Threadcode mal hier reinstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503428</guid><dc:creator><![CDATA[igE]]></dc:creator><pubDate>Sat, 17 Apr 2004 18:23:54 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Sat, 17 Apr 2004 19:01:52 GMT]]></title><description><![CDATA[<p>ich meine das so (ich mache das auch so vom prinzip her bei anderen problemen):</p>
<p>du rufst von deiner hauptdialogfelsklasse deinen thread auf:</p>
<pre><code class="language-cpp">CThreadClass* m_xDisplayThread;

m_xDisplayThread = (CThreadClass*)
AfxBeginThread(RUNTIME_CLASS(CThreadClass), NULL, 0, CREATE_SUSPENDED); 

m_xDisplayThread-&gt;SetOwner(this); 
m_xDisplayThread-&gt;ResumeThread();
</code></pre>
<p>aus der int CThreadKlasse::Run() -funktion kannst dann folgendes machen:</p>
<pre><code class="language-cpp">m_pOwner-&gt;DeineFunktion();     // hier kannst du dann den socket initialisieren
</code></pre>
<p>ich meine damit das du alles von deiner dialogfeldklasse aus steuerst.<br />
kann mir nur vorstellen das daran liegen könnte. du kannst ja von einem thread ja auch nicht direkt auf einen anderen thread zugreifen, nur vom thread aus auf deine dialogfeldklasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503443</guid><dc:creator><![CDATA[Red Skall]]></dc:creator><pubDate>Sat, 17 Apr 2004 19:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Mon, 19 Apr 2004 07:21:51 GMT]]></title><description><![CDATA[<p>Ich habe in meiner Klasse den Thread so deklariert</p>
<pre><code class="language-cpp">CWinThread* m_ConnectThread;
</code></pre>
<p>Dann starte ich den Thread so</p>
<pre><code class="language-cpp">m_ConnectThread = AfxBeginThread(MyTransCtrlFunction ,(LPVOID)this);
</code></pre>
<p>Und in dort rufe ich dann eine Funktion auf die eine endlos-schleife hat und bei events die Verbindung aufbauen oder schliessen soll.</p>
<pre><code class="language-cpp">UINT MyTransCtrlFunction(LPVOID pParam)
{
	((CDataTransCtrl*) pParam)-&gt;ConnectThread();
	return 0;
}
</code></pre>
<pre><code class="language-cpp">void CDataTransCtrl::ConnectThread()
{
    while(1)
   {
	// Wartet bis die Verbindung aufgebaut werden muss
	::WaitForSingleObject(m_pWnd-&gt;g_eventSConnect,INFINITE);
	// löscht die vielleicht noch anliegenden Close-Events
	::WaitForSingleObject(m_pWnd-&gt;g_eventSClose,0);

             .....
            // Hier wird die Verbindung aufgebaut (s.ersten Eintrag)		

	// Wartet bis die Verbindung geschlossen werden muss
	::WaitForSingleObject(m_pWnd-&gt;g_eventSClose,INFINITE);
	// löscht die vielleicht noch anliegenden Connect-Events
	::WaitForSingleObject(m_pWnd-&gt;g_eventSConnect,0);

	  .........
             //Hier wird die Verbindung wieder geschlossen
   }
}
</code></pre>
<p>So funktioniert das aber nicht. Welche Thread nimmst du den wo man eine Run-Methode hat? Vielleicht geht das ja mit der.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/504129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/504129</guid><dc:creator><![CDATA[igE]]></dc:creator><pubDate>Mon, 19 Apr 2004 07:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Mon, 19 Apr 2004 12:15:32 GMT]]></title><description><![CDATA[<p>bei mir sieht das so aus:</p>
<p>- Erst erstellst du ne Klasse die abgeleitet von 'CWinThread' ist.<br />
dann fügst du diese funktionen / variablen in deine threadklasse ein (public):</p>
<pre><code class="language-cpp">void SetOwner(CHauptDlg* pOwner);
	CHauptDlg* m_pOwner;                  // hauptdialogfeld-klasse var.
	CHauptDlg* m_dialogvar;               // hauptdialogfeld-klasse var.
	virtual int Run();
</code></pre>
<p>in die funktion 'SetOwner(CHauptDlg* pOwner)' setzt du das:</p>
<pre><code class="language-cpp">m_pOwner = pOwner;
</code></pre>
<p>in die funktion 'int Run()' setzt du dann das was deine Threadklasse machen soll (von da kannst du auch über deine m_pOwner -variable aus über dein hauptdialogfeld alles machen was du willst.</p>
<p>- In die threadklasse kommt natürlich noch die headerfile vom hauptdlg.<br />
- im hauptdlg erstellst du dann eine variable (auch public):</p>
<pre><code class="language-cpp">CThreadClass* m_xDisplayThread;       // thread-klasse var.
</code></pre>
<p>- und in die headerfile deiner hauptdialogfeld-klasse mußt du dann auch noch die threadklasse angeben:</p>
<pre><code class="language-cpp">class CThreadClass;
</code></pre>
<p>wenn du jetzt noch die headerfile deiner threadklasse in dein hauptdialogfeld einfügst kannst du damit arbeiten.<br />
den thread ruftst du jetzt so auf:</p>
<pre><code class="language-cpp">m_xDisplayThread = (CThreadClass*)
	AfxBeginThread(RUNTIME_CLASS(CThreadClass), NULL, 0, CREATE_SUSPENDED); 

	m_xDisplayThread-&gt;SetOwner(this); 
	m_xDisplayThread-&gt;ResumeThread();
</code></pre>
<p>wenn das dann immer noch nicht klappt, was ich glaube <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    />, dann initialisier den socket mal in deiner hauptdialogfeldklasse und versuch das dann mal so ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/504320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/504320</guid><dc:creator><![CDATA[Red Skall]]></dc:creator><pubDate>Mon, 19 Apr 2004 12:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Mon, 19 Apr 2004 14:07:23 GMT]]></title><description><![CDATA[<p>Wenn ich diese Zeile schreibe:</p>
<pre><code class="language-cpp">m_ConnectThread = (CConnectThread*) AfxBeginThread( RUNTIME_CLASS ( CConnectThread ), NULL, 0, CREATE_SUSPENDED);
</code></pre>
<p>Bekomme ich egal ob die leerzeichen bei RUNTIME_CLASS(CConnectThread) reinmache oder weglasse folgenden Compilerfehler:</p>
<blockquote>
<p>error C2039: 'classCConnectThread' : Ist kein Element von 'CConnectThread'</p>
</blockquote>
<p>Was bedeutet das? Und wie kriege ich den weg?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/504409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/504409</guid><dc:creator><![CDATA[igE]]></dc:creator><pubDate>Mon, 19 Apr 2004 14:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Mon, 19 Apr 2004 15:22:58 GMT]]></title><description><![CDATA[<p>kann jetzt echt nicht sagen was du da falsch / anders gemacht hast. haste ICQ oder sowas !? dann kann ich dir mal nen beispiel schicken</p>
]]></description><link>https://www.c-plusplus.net/forum/post/504479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/504479</guid><dc:creator><![CDATA[Red Skall]]></dc:creator><pubDate>Mon, 19 Apr 2004 15:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to CAsyncSocket in einem Thread on Mon, 19 Apr 2004 15:53:29 GMT]]></title><description><![CDATA[<p>Ja, meine ICQ-Nummer ist 112191425. Wäre nett wenn du mir mal was schicken könntest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/504511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/504511</guid><dc:creator><![CDATA[igE]]></dc:creator><pubDate>Mon, 19 Apr 2004 15:53:29 GMT</pubDate></item></channel></rss>