Irgendwas läuft da schief ;O



  • Servus Leute,

    ich habe ein Problem mit einem Programm, an dem ich momentan schreibe : Einem Chat-Programm, ein kleines.
    Problem-Beschreibung : Angenommen es sind 3 Clienten connected. A B und C. A und B chatten schon miteinander, außerdem chattet auch C mit A. D.h : Bei Client A werden nun 2 Fenster offen sein : Eins mit Client B und eins mit Client C.
    Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, dass diese Nachrichten im Falschen Fenster ausgegeben werden; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.
    Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.

    Hier ist der Code, der eigentlich für die entsprechenden Nachrichten das RICHTIGE Fenster finden sollte :

    void GuiMaintainer::UpdateWindowOutput( const char* text, std::string szChatPartner ) {
    
    	 if ( NmbrOfChatWindows == 0 ) {
    		createChatWindow( szChatPartner );
    		UpdateWindowOutput ( text , szChatPartner );
    		return;
    	 }
         for ( int i = 0; i < NmbrOfChatWindows; i ++ ) {
             if ( ChatWindowHandles[i]->chatPartner == szChatPartner ) {
    
                std::string temp(text);
                ChatWindowHandles[i]->OutputData.push_back(temp);
                SendMessage( ChatWindowHandles[i]->output , LB_ADDSTRING, 0,0);
                SizeListItems( ChatWindowHandles[i]->output , ChatWindowHandles[i]->OutputData );
                SendMessage( ChatWindowHandles[i]->output , WM_VSCROLL, SB_BOTTOM, 0);
    			break;
             }
    		 else if ( i == NmbrOfChatWindows-1 ) {
    
                  createChatWindow( szChatPartner );
                  UpdateWindowOutput( text , szChatPartner );
    
                  }      
         }   
    
    }
    

    Das vector-struct was hier verwendet wird :

    struct chatwindow {
           HWND mainWindow, input, output;
           std::vector < std::string > OutputData;
           std::string chatPartner;
    };
    
    std::vector < std::tr1::shared_ptr<chatwindow> > ChatWindowHandles;
    

    Die Funktion, die die eigentliche Ausgabe macht hat mir ein Member aus der Foren-Community geschrieben, da ich das mit dem Zeilenbruch etc. nicht hinbekommen hab. An der wirds aber nicht liegen, lief bis jetzt immer perfekt. Trotzdem poste ich sie eben :

    void GuiMaintainer::SizeListItems( HWND list, const std::vector<std::string>& Data) {
                       if(!Data.size()) return;
                       HDC hdc = GetDC(list);
                       SelectObject(hdc, reinterpret_cast<HFONT>(SendMessage(list, WM_GETFONT, 0, 0)));
                       bool erasebk = false;
                       for(size_t i=0;i<Data.size();++i) {
                           RECT itm;
                           SendMessage(list, LB_GETITEMRECT,i,reinterpret_cast<LPARAM>(&itm));
                           int h = DrawText(hdc,
                           Data[i].c_str(),
                           Data[i].length(),
                           &itm,
                           DT_LEFT | DT_WORDBREAK | DT_CALCRECT);
                           if(h != SendMessage(list, LB_GETITEMHEIGHT,i,0)) {
                           erasebk  = true; 
                           SendMessage(list, LB_SETITEMHEIGHT, i, h);
                           }
                       }
                       ReleaseDC(list,hdc);
                       InvalidateRect(list, 0, erasebk); 
    }
    

    Und der entsprechende Teil in der Call-back function :

    case WM_DRAWITEM : {
    
    for( int i = 0; i < NmbrOfChatWindows; i ++ ) {
    
                      if ( ChatWindowHandles[i]->output == GetDlgItem( ChatWindowHandles[i]-> mainWindow, wParam)   ) {
    
                           LPDRAWITEMSTRUCT lpd = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam);
                           switch (lpd->itemAction) {
                           case ODA_SELECT:
                           case ODA_DRAWENTIRE:
    
                           if(ChatWindowHandles[i]->OutputData.size() < lpd->itemID) { break; } 
                           SetBkMode(lpd->hDC, TRANSPARENT);
                           FillRect(lpd->hDC, &lpd->rcItem,
                                   (lpd->itemState & ODS_SELECTED)? GetSysColorBrush(COLOR_HIGHLIGHT): GetSysColorBrush(COLOR_WINDOW));
    
                           DrawText(lpd->hDC,
                                    ChatWindowHandles[i]->OutputData[lpd->itemID].c_str(),
                                    ChatWindowHandles[i]->OutputData[lpd->itemID].length(),
                                    &lpd->rcItem,
                                    DT_LEFT | DT_WORDBREAK );
                           case ODA_FOCUS:
                                break; 
                           }
                      }
                 }
    }
    

    Ich hoffe ich hab alles wichtige drin. Ich glaube ja, dass es eigentlich in der GuiMaintainer::UpdateWindowOutput liegen müsste, finde da aber eigentlich nichts fehlerhaftes.

    Danke schonmal im Voraus
    MFG



  • Hmm_/ schrieb:

    Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, dass diese Nachrichten im Falschen Fenster ausgegeben werden; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.
    Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.

    Na, in welchem Fenster denn nun ?



  • [gg]site:msdn.microsoft.com

    Hacker schrieb:

    Hmm_/ schrieb:

    Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, dass diese Nachrichten im Falschen Fenster ausgegeben werden; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.
    Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.

    Na, in welchem Fenster denn nun ?

    Die Nachrichten, die Client C schickt, kommen ganz normal im entsprechenden Fenster an. Leider tritt dann dieser Effekt, den ich beschrieben habe, auf, wenn Client B wieder was senden will.


Anmelden zum Antworten