Zeitproblem



  • hallo,

    ich habe folgende Programmcode:

    CListCtrl* pListCtrl = (CListCtrl*)(theServerApp.pDlg->pListCtrl);
    m_count = pListCtrl->GetItemCount()-1;
    pListCtrl->SetItemText(m_count,1,text);
    m_Name = text;
    

    Hier wird ein Name in ein Listenfeld geschrieben. In einer anderen Funktion möchte ich diesen Namen an den Client senden:

    AfxMessageBox("Test");
    Message msgToAll(MSG_USER_JOIN);
    msgToAll.SetElementAt(0, m_Name);
    SendMessageToAll(msgToAll);
    

    Zu Testzwecken habe ich die MessageBox eingefügt. Es funktioniert auch bestens. Lasse ich jetzt die MessageBox weg, bekommt der Client den Namen nicht, wahrscheinlich, weil das Listenfeld noch nicht gefüllt bzw. der erste Programmcode noch nicht ausgeführt ist.

    Hat jemand ne Idee, wie man sicherstellen kann, dass der erste Code vor dem Ausführen des zweiten durchlaufen ist (ohne MessageBox)??



  • anregung...

    überprüfe ob den name schon da is wenn net warte nen paar ms

    while(name=="")
    {
    sleep(1);
    }

    so inner rat !?!

    is nur ne dumme kleine idee weiss net ob dus so realisieren kannst



  • danke für den Tip,

    hörte sich auch plausibel an, aber dann
    hängt der Server sich auf...



  • dann durchläuft er die schleife wohl unendlich ... dh. in der variable steht einfach nix drinne

    hm ...
    an dem m_ erkenne ich schätze mal das es ne membervar. zu einem dialog feld ist oder? machste vorher nen UpDatedata(1); das du auch was daraus erhälst ? was steht drin wenn du mit nem debugger durch gehst ?



  • Genau, in der Variable steht nichts.
    Auch der Debugger sagt, m_Name is leer.

    m_Name is ne Variable, aber nich zu einem Dialogfeld...

    Das Prob is, das mit der MessageBox die zweite Funktion erst nach der ersten ausgeführt wird, so wie es sein soll.
    Ohne MessageBox wird sie wahrscheinlich sogar noch vorher ausgeführt.



  • hm schätze du machst das in unterschiedlichen threads ? sonst kann man die ja net gleichzeitig laufen lassen oda ? 😑

    mit messagebox läuft es auch wenn du sie sozusagen sofort weg klickst ?

    mir gehn meine spärlichen ideen langsam aus



  • Schau dir mal das Thema Thread-Synchronisation an, ich denke ein WaitForSingleObject mit einem CEvent könnte da vieleicht helfen, dass die Funktion des 2. Threads erst ausgeführt wird, wenn das entsprechende Ereigniss im ersten eingetreten ist.



  • ich habe eine Client- und eine Server-Anwendung. Die Client-Anwendung versucht eine Verbindung zum Server aufzubauen, danach wird der Name an den Server geschickt.
    Während der Server die Verbindung akzeptiert und weitere Funktionen ausführt, wird wahrscheinlich beim Client die Funktion SendName ausgeführt.
    Komischerweise ist diese mit einer MessageBox in der anderen Funktion schneller fertig.

    Nach langem Überlegen habe ich jetzt (ganz) einfach den Aufruf der zweiten Funktion in die erste verlegt und es funzt.
    Trotzdem danke für eure Hilfe!!

    könnte es mit der Thread-Synchronisation denn auch gehen, so wie ich mein Problem geschildert hab?



  • 😕

    Verwedest du jetzt Threads oder nicht.
    Wenn nicht können nicht 2 Funktionen "GLEICHZEITIG" ausgeführt werden.

    Um Threads zu Syncronisieren: Mutex,Semaphore



  • Ich kann nur sagen, dass Client und Server jeweils ein eigener Prozess sind, ja.



  • Was haben 2 Unterschiedliche Programme mit Threads zu tun.
    Verstehe fast nicht mehr.

    Wenn der Client einen Socket erstellt und connect aufruft, kehr connect erst zurüch wenn der Server die Verbindung accept hat.
    (Betrifft jet nicht Asyncsocket sonder CSocket)

    Also kann der Cleint ert dann zum Server senden wenn der Server auf den Socket lesen kann.

    Wenn es Async ist, dann solltest du ert die Message OnConnect() abwarten und dann senden.



  • Richtig, der Client ruft Connect auf, daraufhin ruft der Server in einer Funktion xy Accept auf, womit Connect zurückkehrt.
    D.h. der Client kann nun senden.
    In der Funktion xy des Servers stehen aber noch weitere Anweisungen, unter anderem der Aufruf der Funktion mit der MessageBox. Diese Anweisungen werden doch weiterbearbeitet, während beim Client die erste Funktion aufgerufen wird, die den Namen sendet, weil es ja zwei Programme sind.
    Abgesehen davon ist das Problem ja auch schon geklärt.
    Danke für alle Tips!



  • Na wenn das deine Lösung sein soll dann ist es gut.


Log in to reply