Hallo Keimling,
- Wird :
nConnect() überhaupt aufgerufen, hier ist nicht
sichtbar wie das gemacht wird.
OnConnect wird von der von CAsyncSocket abgeleiteten Klasse
CMySocket aufgerufen
void CMySocket:
nConnect(int nErrorCode)
{
// Sind Fehler aufgetreten?
if (nErrorCode == 0)
// Nein, OnAccept-Funktion des Dialogfelds aufrufen
((CGateDlg*)m_pWnd)->OnConnect();
}
Also wenn die verbindung steht wird OnConnect aufgerufen.
Tja, aber Welches? Siehe unten.
- Wird :
nConnect() für eine andere Instanz des Objekts
aufgerufen ??
ich weis nicht genau was du meinst, aber ich glaube das sagt
der code aus 1.
Also etwas grundsätzliches zu OOP.
Mit einer Klasse definierts du Methoden und Variablen für ein Objekt. Im Prinzip so etwas wie ein Kuchen-Rezept (Methoden) mit der zusätzlichen Angabe der zu verwendenden Schüsseln (Variablen), das ist aber noch kein Kuchen !!
Normalerweise mit „new“ instanzierst du ein Objekt, erstellst also eine Küche mit dem Rezept, den Schüsseln und einem Bäcker (die CPU, bzw. einem Task oder Thread).
Wenn du „new“ ein zweites mal aufrufst erstellt du eine zweite Küche, mit einem zweiten Rezept, weiteren Schüsseln und einem zweiten Bäcker !
Jetzt kann es sein, dass sich „while(!m_bConnect)“ in Küche 1 befindet aber „OnConnect()“ der Küche 2 aufgerufen wird und somit keine auswirkung auf Küche 1 hat.
- Compiler Optimierungsfehler, versuche m_bConnect als
„volantile“ zu deklarieren.
Was meinst du damit?
Der Compiler versucht den Code zu optimieren, kann man auch abschalten.
Zugriffe auf den Hauptspeicher, wo z.B. „m_bConnect“ abgelegt ist sind wesentlich langsamer als ein Zugriff auf ein Register der CPU. Der Compiler optimiert dahingehend, dass er eine Kopie von „m_bConnect“ in ein CPU-Register lädt und in der while-Schleife dann immer die Kopie im CPU-Register testet. Wenn nun „m_bConnect“ im Hauptspeicher verändert wird, ändert sich dadurch die Kopie im CPU-Register nicht und du hängst in der Schleife fest. Der Compiler „sieht“ ja nicht, dass der Wert von „m_bConnect“ von ausserhalb der Schleife verändert werden kann.
Wenn du nun m_bConnect anstatt
bool m_bConnect;
als
bool volatile m_bConnect;
deklarierst, erklärst du dem Compiler, dass diese Variable von „ausserhalb“ verändert werden kann und der Compiler immer auf den Hauptspeicher zugreiffen muss und nicht mit einer Kopie arbeiten darf.
MfG Peter(TOO)