Ich lerne network programming
auf MFC
und habe hier Flunder Leitfaden hier referenziert: http://www.flounder.com/kb192570.htm mit Multi-Thread-und Socket zu versauen. Aber meine Arbeit ist einfacher.
Was ich versuche, ist ein Multi-Thread-Server-Client-Modell zu machen. Der Server sitzt nur herum und hört zu, während die Clients Telnet dazu machen. Sobald Verbindungen vorhanden sind, erstellt der Server Threads für die Verbindung in OnAccept()
. Bei der Erstellung wird der Thread PostMessage
mit seiner Thread-ID an die Haupt-GUI übergeben. Die GUI behandelt dann diese Nachricht mit einer Funktion, um eine MessageBox
anzuzeigen, um die Thread-ID anzuzeigen. Einfach so.
Mein Problem ist: trotz der Fäden erfolgreich gemacht, und so auf der Socket-Handle die informieren Nachricht von Thread (Ich habe es auf netstat
geprüft) noch nie in GUI gesendet.
Hier ist mein Code:
CListenSocket.h
und CConnectSocket.h
in .h ziemlich gleich sind (abgeleitet von CSocket
)Mit CSokcet und CWinThread funktioniert PostMessage vom Thread nicht
......
public:
//Handle CWnd pointer from main GUI
void SetParrent(CWnd * w) { windowsParrent = w; }
CWnd * GetParrent() { return windowsParrent; }
protected:
CWnd *windowsParrent;
.......
};
CClientThread.h
(abgeleitet von CWinThread
)
....
public:
void SetParrent(CWnd * w) { windowsParrent = w; }
CWnd * GetParrent() { return windowsParrent; }
SOCKET handleThreadSocket;
CConnectedSocket threadSocket;
protected:
CWnd *windowsParrent;
....
Nun, wenn Ich mache den Listen-Socket, ich habe den CWnd-Zeiger der GUI an ihn übergeben:
CListenSocket m_Listener;
....
m_Listener.SetParrent(this);
m_Listener.Create(1001);
m_Listener.Listen();
Dann OnAccept()
von CListenSocket
der Faden hergestellt ist, aber ich habe nicht vergessen, den CWnd-Zeiger passieren ...
void CListenSocket::OnAccept(int nErrorCode)
{
if(nErrorCode != 0)
{
CSocket temp_soc;
CClientThread *pThr = (CClientThread*)AfxBeginThread(
RUNTIME_CLASS(CClientThread),
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pThr->SetParrent(windowsParrent);
pThr->handleThreadSocket = temp_soc.Detach();
pThr->ResumeThread();
}
CSocket::OnAccept(nErrorCode);
}
CThreadClient.cpp
: Thread-Erzeugung
BOOL CClientThread::InitInstance()
{
threadSocket.Attach(handleThreadSocket);
if (threadSocket == NULL)
{
return FALSE;
}
if (windowsParrent == NULL)
{
return FALSE;
}
windowsParrent->PostMessage(THREAD_STARTED,0,(LPARAM)m_nThreadID);
return TRUE;
}
Schließlich I kartiert die THREAD_STARTED
mit einer Funktion, nur um dieses einfache Ding zu tun:
ist die Abbildung:
BEGIN_MESSAGE_MAP(CServerSideDlg, CDialog)
...
//}}AFX_MSG_MAP
ON_MESSAGE (THREAD_STARTED, OnThreadStart)
END_MESSAGE_MAP()
Thema arbeitet, Anschlussbuchse auch funktioniert, aber es gibt keine Nachricht geschrieben wurden. Bitte hilf, wo liege ich falsch. Vielen Dank im Voraus.
Haben Sie 'ON_MESSAGE (THREAD_STARTED, OnThreadStart)' zu Ihrer CServerSideDlg BEGIN/END-Nachrichtentabelle hinzugefügt? – marcinj
Ja, tat ich. und 'THREAD_STARTED' wurde definiert als' WM_USER + 200' –
Sind Sie sicher, dass diese Zeile 'if (threadSocket! = NULL)' korrekt ist? Nach dem Anhängen würde ich annehmen, dass es nicht NULL zurückgibt. – marcinj