thread / socket - problem
-
ich hab da ein kleines problem, und ich weiss nicht warum....
damit die hauptanwendung nicht blockiert wird, wenn mein AcceptSocket das Accept ausführt, wollte ich diesen in einen eigenen thread auslagern.
nach dem programmstart bekomme ich ein assert.
ich habe mich bis in die basisklasse csocket::pumpmessage debugged, und stellte fest, das pState->m_hSocketWindow NULL ist.
das ist aber nur der fall, wenn ich die Methode CheckAccept() { in meiner Appklasse } vom thread aufrufen lasse, wird diese methode innerhalb der Appklasse aufgerufen funzt das einwandfrei.
vielleicht hat jemand ein paar tipps, die mir in diese richtung weiterhelfen können.
danke !//**************************************************** // CMyApp is abgeleitet von CWinApp // CMyFrame is abgeleitet von CFrameWnd // CMySocket is abgeleitet von CSocket //**************************************************** #include "Main.h" //**************************************************** CString g_strHostAddress = "127.0.0.1"; int g_nHostPort = 4000; //**************************************************** // //**************************************************** void CMySocket::OnReceive(int nErrorcode) { CString strMessage; int nNumber=Receive(strMessage.GetBuffer(513),512); strMessage.ReleaseBuffer(); strMessage.SetAt(nNumber,'\0'); AfxMessageBox(strMessage); CAsyncSocket::OnReceive(nErrorcode); } //**************************************************** // //**************************************************** CMyFrame::CMyFrame() { Create(NULL,"thread/socket test"); } //**************************************************** // //**************************************************** BOOL CMyApp::InitInstance() { m_pMainWnd=new CMyFrame(); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); AfxBeginThread(AcceptThread,this,THREAD_PRIORITY_BELOW_NORMAL); if(AfxSocketInit()) { TRACE("Sockets Initialisiert.\n"); if(m_acceptsocket.Create(g_nHostPort)) { TRACE("Socket erzeugt.\n"); if(m_acceptsocket.Listen()) { TRACE("Socket lauscht\n"); m_eventStartAcceptThread.SetEvent(); } else TRACE("Kann Socket nicht verbinden\n"); } else TRACE("Kann Socket nicht erzeugen\n"); } else TRACE("Kann Socket nicht initialisieren\n"); return TRUE; } //**************************************************** // //**************************************************** int CMyApp::ExitInstance() { m_eventStartAcceptThread.SetEvent(); m_eventStoppAcceptThread.SetEvent(); return CWinApp::ExitInstance(); } //**************************************************** // // Diese Methode wird von einem eigenen Thread // aufgerufen !! // // der fehler passiert hier im aufruf von accept. // und zwar in der basisklassenmethode pumpmessage // von CSocket. // dort is pState->m_hSocketWIndow == 0 !!! // aber warum, was mache ich falsch ??? // //**************************************************** int CMyApp::CheckAccept() { int nResult = m_acceptsocket.Accept(m_socket); if(nResult) { TRACE("Akzeptiert !\n"); } else TRACE("Nicht akzeptiert !"); return nResult; } //**************************************************** // static !!!!!! da eigener Thread // dieser ruft check accept auf, wo der fehler // passiert ! //**************************************************** UINT CMyApp::AcceptThread(LPVOID WinObjPtr) { CMyApp *lpApp=(CMyApp*)AfxGetApp(); WaitForSingleObject(lpApp->m_eventStartAcceptThread ,INFINITE); while(1) { if(!WaitForSingleObject(lpApp->m_eventStoppAcceptThread,WAIT_OBJECT_0)) break; lpApp->CheckAccept(); } return 0; } //**************************************************** //**************************************************** //****************************************************
-
ich habe mal gelesen, (und auch selbst erfahren) dass man sockets, die man in einem thread verwenden will auf dem heap ablegen (also mit new anlegen) muss.
ob das jetzt für die mfc sockets innerhalb von mfc threads auch gilt, weiss ich leider nicht ...grüsse
-
danke für den hinweis, jetzt funzts !
-
Und ich habe mal gelesen das es in der MFC auch was dafür gibt.
CAsyncSockets