Warten auf OnReceive-Ereignis



  • Hallöle,

    i hab da a problem 🙂

    und zwar hab ich mir eine Klasse geschrieben die eine Telnetverbinung aufbaut (Verbindungsdaten aushandeln etc.) und danach auf einer Maschine ein paar Umgebungsvariablen setzt und dann ein Programm startet. Dazu muss man nur eine Methode der Klasse mit ein paar Params aufrufen.

    klappt soweit alles einwandfrei.

    Jetzt wär es ganz super wenn diese Methode mir zurückgeben würde wenn ein bestimmter String von Socket geholt wurde. Es kann nun aber sein das dazwischen locker 100mal die OnReceive aufgerufen wird. Wie bekomme ich es nun hin das meine Methode nach dem connecten solange wartet bis OnReceive etwas bestimmtes Empfäng und erst dann weiterläuft/beendet wird.

    ich steh da grad voll auf dem Schlauch 🤡



  • ich bin nicht so der crack, hoffe habe dein Prbolem richtig verstanden, aber kannst du das nicht löschen wenn eine while Schleife in die OnReceive Method packst die dann weiterläuft bzw. raus geht aus der Methode?

    MfG
    T1c4L



  • thx, sry aber: ? 🙂

    Ne, die OnReceive ist von CAsyncSocket abgeleitet und wird immer aufgerufen wenn Daten am Socket ankommen. Dann werden die Daten in der OnReceive verarbeitet. Dann ist die OnReceive zuende und wartet bis wieder was am Socket ankommt. Jetzt soll das beliebig oft passieren bis was bestimmtes am Socket ankommt.

    während das ganze passiert soll die funktion in der ich den Socket erstellt und connected habe genau auf diesen Moment warten und erst dann weiterlaufen.

    Sollte ich den Socket vielleicht in einem anderen Thread starten und den Hauptthread pausieren lassen und im richtigen Moment weiterlaufen lassen? Wenn ja: WIE? 😃

    oder geht das auch irgendwie anders?



  • 😛

    Die OnReceive ueberschreiben?

    die OnReceive sagt doch nur das du was mit Recieve holen kannst oder? und nicht was es ist oder?

    :-p



  • Ja du hast Recht. Sie sagt mir das was da ist. Das hole ich dann ab und werte es aus. Ist korrekt. Ist aber (glaube ich) nicht mein Problem.

    ich will es halt nur schaffen, das meine Funktion die die den Socket erstellt und den Connect ausführt wartet.

    Also ich könnte jetzt mein Programm so schreiben das es halt eine MsgBox oder so ausgibt sobald meine gewünschten Daten angekommen sind. Doch anstatt einer "doofen" MsgBox soll dann die Funktion fortgesetzt werden.

    nu verstanden?

    mfg
    tobi



  • falls ich immernoch nicht gecheckt habe 😉 trotzdem hier ein weitere vorschlag..

    läuft das in nem serpaten Thread?
    du kannst den socket als "Suspended" starten und ihn "fortsetzen"....

    schreibe extra wenig damit ich zu nix falschen schreib 😉



  • Ahh 🙂

    du kannst den socket als "Suspended" starten und ihn "fortsetzen"....

    Das hört sich doch schon gut an. Da werd ich gleich mal drüber nachforschen 😉

    Bisher läuft es nicht in einem eigenen Thread. Bisher wird eine Funktion gestartet, diese setzt ein paar Membervariablen, und macht dann ein connect. Dann beendet sich die Funktion.
    Alles weitere hab ich in der OnReceive stehen. Da werden dann zuerst die Verbindungsparameter ausgehandelt, der login durchgeführt und wenn das alles fertig ist ein Programm gestartet (der Sting dazu wurde ja als Membervariable gesetzt). Alles was an ASCII-Text ankommt und kein Telnet-Befehl ist wird in ein CEdit geschrieben.

    Blöderweise soll nun die Funktion die sich ja beendet warten, damit sie einen Rückgabewert liefern kann der von dem ausgeführten Programm abhängig ist.

    Das geht dann nur per Threads, ja?

    aber wie gesagt, das mit dem suspended hört sich schon ganz gut an. Ich gucke mal..



  • okay, ich glaub ich weiss jetzt genauer was ich eigentlich will 🙂

    Funktion läuft.
    Funktion erstellt Socket
    Funktion erstellt neuen Thread und führt darin Connect aus.
    Funktion wartet auf Ende des Threads
    Funktion beendet sich
    
    Im Thread wird Connect ausgeführt
    Im Thread wird OnReceive ausgeführt
    Thread beendet sich in OnReceive
    

    ist das so möglich?



  • Tow-B.de schrieb:

    okay, ich glaub ich weiss jetzt genauer was ich eigentlich will 🙂

    Funktion läuft.
    Funktion erstellt Socket
    Funktion erstellt neuen Thread und führt darin Connect aus.
    Funktion wartet auf Ende des Threads
    Funktion beendet sich
    
    Im Thread wird Connect ausgeführt
    Im Thread wird OnReceive ausgeführt
    Thread beendet sich in OnReceive
    

    ist das so möglich?

    ich glaube schon ich mache sowas ähnliches nur nicht mit Telnet...



  • Ich verstehe dein Problem eigentlich sowieso nicht. Wozu einen Thread. CAsyncSocket hat bereits eine Thread. Aber OK. Du musst in der Rec schauen ob du nun beenden sollst. Dann einfach den Thread verlassen. Ich weiß jetzt zwar nicht wie du den Thread startest aber ein return würde es bei einer von CWinThread-Klasse in der RUN() auch tun.



  • erstmal danke für eure Antworten!

    Du musst in der Rec schauen ob du nun beenden sollst. Dann einfach den Thread verlassen.

    Genau so hab ich das ja vor, wenn du mit Rec Receive meinst 🙂 bei mir ist das so:

    myAsyncClass::Run()
    {
    blabla;
    
    Create();
    Connect(m_strIp, m_iPort);
    }
    

    und direkt nach dem Connect soll die Funktion warten bis per Receive was bestimmtes ausgelesen wird (egal wie lange das auch dauert) und danach weiterlaufen. Aber wie lass ich die Funktion warten? und wie (von myAsyncClass::OnReceive aus) weiterlaufen? ich brauche ja einen Rückgabewert con Run() bezüglich den empfangenen Daten.

    mfg
    tobi



  • Da brauchst du eine Schleife. Deshalb sagte ich ja mache es ohne Threads.
    CAsyncSockets startet bereits eine Thread zum senden Empfangen.
    Den Thread kannst du ja nehmen wenn du etwas verarbeiten willst.
    Sieh dir dazu das Bsp. in VC++ 6 in 21 Tagen an.



  • okay. Ich muss also den Hauptthread meines Programm in die Leerlauf-Schleife bringen solange bis der Thread in dem mein CAsyncSocket-Thread die Schleife wieder beendet.

    Dann hab ich mir die Seiten in VC++ in 21 Tagen durchgelesen und dabei bin ich auf CEvent gestoßen. Und laut dem Buch und MSDN verstehe ich das so, das es das sein sollte was ich brauche. Aber ich bekomme es irgendwie nicht hin.

    Ich erstelle ein Objekt von CEvent und setze es dann dem Hauptthread mit ResetEvent() in den Leerlauf. Der CAsyncSocket-Thread kann dann mit SetEvent() oder Pulsevent() (z.B. in OnReceive) die Nachricht schicken das der Hauptthread-Thread an der Stelle von ResetEvent() weiterlaufen soll.

    Create();
    Connect(m_strIp, m_iPort);
    event = new CEvent(false, true);
    event->ResetEvent();
    
      AfxMessageBox("foo");
    
    delete event;
    

    ich werde weder aus dem Buch noch aus der MSDN wirklich schlau, und google gibt dazu auch nicht viel her 😕



  • Nun gut 😃

    nachdem ich mir noch einige Seiten und Threads durchgelesen habe bin ich noch auf eine andere Idee gekommen.

    m_bWait = true;
    Create();
    Connect(m_strIp, m_iPort);
    
    while(m_bWait)
    {
      Sleep(1);
    }
    

    Allerdings wird während er in der while-schleife hängt der andere Thread nicht weiter ausgeführt (in dem ich in OnReceive m_bWait auf false setze).

    Zum CEvent habe ich auch noch weitergesehen. Da müsste ich dann wohl mit WaitForSingleObject auf den CEvent-Status warten, aber um das starten brauch ich das HANDLE auf CEvent was aber keine Create-Methode hat. Blöde Frage, aber WIE bekomm ich das nachträglich 😕



  • Du leitest dir eine Klasse von CAsyncSockets ab. Die Methoden dieser Klasse sind alle virtual.

    Dann erstelltung eine instanz dieser Klasse in deinem Hauptdialog. So wie es in Vc++ 6 in 21 Tagen beschrieben ist. Nichts da mit CEvent.

    IN deiner Hauptklasse machhst du nun den Connect. Deine abgeleitete Klasse wir benachrichtig wenn ein erreigniss aufgetreten ist.

    Ob du diese jetzt an deinen Hauptdialog übergibst oder du direkt in der Abgeleitetetn Klasse weitermachst überlasse ich dir. Ich rufe bei einem Event eigentlich immer eine Funktion im Hauptdialog auf und reagiere im Hauptdialog darauf. o wie es in Vc++ 6 in 21 Tagen beschrieben ist.



  • Du leitest dir eine Klasse von CAsyncSockets ab. Die Methoden dieser Klasse sind alle virtual.

    Logisch, so hab ich das gemacht..

    Dann erstelltung eine instanz dieser Klasse in deinem Hauptdialog. So wie es in Vc++ 6 in 21 Tagen beschrieben ist.

    Jo, sicher, hab ich auch gemacht.

    IN deiner Hauptklasse machhst du nun den Connect. Deine abgeleitete Klasse wir benachrichtig wenn ein erreigniss aufgetreten ist.

    Habe ich auch, Funzt auch einwandfrei..

    Ob du diese jetzt an deinen Hauptdialog übergibst oder du direkt in der Abgeleitetetn Klasse weitermachst überlasse ich dir. Ich rufe bei einem Event eigentlich immer eine Funktion im Hauptdialog auf und reagiere im Hauptdialog darauf.

    Genau im Hauptprogramm kann ich das nicht gebrauchen 🙂 Aber ich habs halt direkt in der abgeleiteten Klasse. Hatte es auch zuerst im Hauptprgramm: Habe auch das Buch dazu gelesen.

    Also ich behaupte mal: Mit der CAsyncSocket-Klasse ansich habe ich nicht Probleme. Die geht soweit einwandfrei und auch das receiven geht wunderbar.

    Mein Ziel ist es: Meine abgeleitete Klasse so zu schreiben das ich ein Objekt meiner Klasse instanziire und dann die Methode

    BOOL Run(pWnd, ip, port, username, passwort, prg, breakstr)

    aufrufe, dann alles alleine geht und die Funktion ein true returned sobald mit receive der breakstr abgeholt wird 🙂

    Es geht fast alles, bis auf das Warten innerhalb von Run() auf den breakstr.

    das letzte Problem: Ich habe zwei Threads (den zweiten erstellt CAsyncSocket ja von selbst), einer vom Hauptprogramm und einer von der AsyncSocketKlasse. Tue ich den ersten nun in eine Schleife, bleibt auch der andere stehen. Wieso? *g*

    puhh, das war jetzt aber viel.. sry Unix-Tom, aber es soll eine lib werden die man einbindet und dann mit 2Zeilen (instanziiren, run) von Windows aus ein Programm auf ner Unix-Maschine starten und das Ergebnis abfragen kann.



  • Tow-B.de schrieb:

    Hallöle,

    i hab da a problem 🙂

    und zwar hab ich mir eine Klasse geschrieben die eine Telnetverbinung aufbaut (Verbindungsdaten aushandeln etc.) und danach auf einer Maschine ein paar Umgebungsvariablen setzt und dann ein Programm startet. Dazu muss man nur eine Methode der Klasse mit ein paar Params aufrufen.
    ...

    Hi, würde gerne wissen, wie du das mit dem Aushandeln machst. Müsste nämlich ein ähliches Programm schreiben, welches auf eine Datenbank am Server zugreift und dort Werte aktualisiert. Kannst du mir vielleicht nen Link empfehlen oder Beispielcode posten?? Komme leider nicht weiter 😞 .


Log in to reply