Schleife unterbrechen

Ich hab ein problem…

folgender code…

m_sConnectSocket.Close();
m_sConnectSocket.Create();
m_sConnectSocket.Connect(m_strServer, 80);
while(!m_bConnect)
Sleep(100);

iSend = m_sConnectSocket.Send(LPCTSTR(strSend),iLen);


void CGateDlg::open_mouth:nConnect()
{
m_ctrlStatus.AddString(„Verbunden“);
m_bConnect = TRUE;
}

Eigendlich sollte das programm einen socket öffnen, und wenn dieser verbunden ist(m_bConnect = TRUE) fortfahren… aber es bleibt in der while schleife hängen…

kann mir jemand bitte helfen?

HALLO,

> folgender code...  
>   
>   
> m\_sConnectSocket.Close();  
> m\_sConnectSocket.Create();  
> m\_sConnectSocket.Connect(m\_strServer, 80);  
> while(!m\_bConnect)  
> Sleep(100);  
>   
> iSend = m\_sConnectSocket.Send(LPCTSTR(strSend),iLen);  
>   
>   
> ---------  
>   
> void CGateDlg::open\_mouth:nConnect()  
> {  
> m\_ctrlStatus.AddString("Verbunden");  
> m\_bConnect = TRUE;  
> }

Eigendlich sollte das programm einen socket öffnen, und wenn
dieser verbunden ist(m_bConnect = TRUE) fortfahren… aber es
bleibt in der while schleife hängen…

kann mir jemand bitte helfen?

Deine Infos sind etwas sehr spärlich!
Ich sehe da mehrere Möglichkeiten:

  1. Wird ::open_mouth:nConnect() überhaupt aufgerufen, hier ist nicht sichtbar wie das gemacht wird.
  2. Wird ::open_mouth:nConnect() für eine andere Instanz des Objekts aufgerufen ??
  3. Wie ist m_bConnect deklariert ?
  4. Compiler Optimierungsfehler, versuche m_bConnect als „volantile“ zu deklarieren.

MfG Peter(TOO)

  1. Wird ::open_mouth:nConnect() überhaupt aufgerufen, hier ist nicht
    sichtbar wie das gemacht wird.

OnConnect wird von der von CAsyncSocket abgeleiteten Klasse CMySocket aufgerufen

void CMySocket::open_mouth: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.

  1. Wird ::open_mouth: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.

  1. Wie ist m_bConnect deklariert ?

class CGateDlg
{
public:
bool m_bConnect;
}

  1. Compiler Optimierungsfehler, versuche m_bConnect als
    „volantile“ zu deklarieren.

Was meinst du damit?

Danke schon mal das du mir hilfst! Bin ein Newbie :smile:

Hallo Keimling,

  1. Wird ::open_mouth:nConnect() überhaupt aufgerufen, hier ist nicht
    sichtbar wie das gemacht wird.

OnConnect wird von der von CAsyncSocket abgeleiteten Klasse
CMySocket aufgerufen

void CMySocket::open_mouth: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.

  1. Wird ::open_mouth: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.

  1. 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)

  1. Wird ::open_mouth:nConnect() überhaupt aufgerufen, hier ist nicht
    sichtbar wie das gemacht wird.

also ONConnect wird auf jeden fal aufgerufen… wenn ich ne Messagebox rein mach wird die aufgerufen

  1. Wird ::open_mouth:nConnect() für eine andere Instanz des Objekts
    aufgerufen ??

Glaub ich nicht, ich hab mal zum Test das ganze ohne ne whileschleife gemacht… und er hat m_bConnect auf TRUE gesetzt

aber wie könnte ich testen ob es ne andere Küche ist?

  1. Compiler Optimierungsfehler, versuche m_bConnect als
    „volantile“ zu deklarieren.

Habe ich versucht… aber es ändert leider nichts…

Kann es sein das die Whileschleife die Komunikation am Sockel stört weil es die anwendung „einfriert“ ?

Gruß Thalhofer M

Hallo,

aber wie könnte ich testen ob es ne andere Küche ist?

manchmal hilft es, wenn man mal den Debugger anwirft und sich das ganze da anschaut.

Gruß

Fritze

Laut Debug ist es de selbe küche

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Thalhofer M,

So langsam solltest du mal damit rausrücken, welches Betriebssystem und welchen Compiler du verwendest.

MfG Peter(TOO)