TRichEdit und ScrollBars crashen



  • Seit einiger Zeit plagt mich o.g. Problem.
    Ich habe eine App mit 3 RichEdits und diese sollen *was sonst* Text wiedergeben.
    Soweit so gut. Sobald aber die Scrollbars irgendwie angepackt werden crasht die App nach unbestimmter Zeit. Ich bin auf der Suche nach Abhilfe über folgenden Link gestolpert.

    http://home.att.net/~robertdunn/Papers/TRichEditHandles.html

    Ich denke Dunns Ausführungen unter #problem 2 meinem Problem entsprechen.

    Nun habe ich eine TRichEdit-Derivat erzeugt und die besagte RecreateWnd() einfach mal überladen und leer gelassen: Problem besteht aber immer noch.

    Hier mal die m.E. relevanten Ausschnitte

    TXController* XController
    
    ...
    
    DWORD WINAPI DisplayThread(LPVOID lpThreadParameter)
    {
    
            BaseController* bc= BaseController::getInstance();
            VideoController* vc= VideoController::getInstance();
            AudioController* ac= AudioController::getInstance();
            stringstream s;
    
            while(XController->isRunning)
            {
    
                     // BaseController
                    if(XController->cbBCLogging->Checked)
                    {
                            // updating limit counter
                            long limit=XController->reditBC->Text.Length();
                            s.seekp(0);
                            s<< limit << "/ " << EDIT_LIMIT << ends;
                            XController->eBCLimit->Text= s.str().c_str();
                            // Autoclear if bufferlimit is reached
                            if (limit>=EDIT_LIMIT)
                                    bc->clearOutput();
    
                            XController->WriteWindow(bc->getOutput(),
                                                    XController->reditBC,
                                                    XController->_bcMutex);
    
                    }
                    // VideoController
                    if(XController->cbVCLogging->Checked)
                    {
                         ... // analog
                     }
                    // AudioController
                    if(XController->cbACLogging->Checked)
                    {
                        ... // analog
                    }
    
                    Sleep(25); // rest a while, baby
            }
            ExitThread(0);
            return 0; // never reached: avoid warning
    }
    
    ...
    
    void __fastcall TXController::WriteWindow(string text, const TRichEdit* win, HANDLE mutex)
    {
            if (text.size()>0)
            {
    
                    WaitForSingleObject(mutex, INFINITE);
                    win->Text = text.c_str();
                    // HERE EVERYTHING IS FUCKED UP
                    // EVEN IF I USE SCROLLBARS MANUALLY
                    win->SelStart = win->Perform(EM_LINEINDEX, win->Lines->Count, 0);
                    win->Perform(EM_SCROLLCARET, 0, 0);
                    ReleaseMutex(mutex);
    
            }
    }
    

    Ich gehe auch davon aus, dass bei mir irgendwo der Wurm drin ist...

    Die Fehlermeldung(Debugger): "Systemfehler: Code 1400. Ungültiges Fensterhandle"
    Das bestätigt letztlich Dunns Schilderungen.

    Wie kann ich dagegen angehen???



  • Nachtrag:
    o.g. Problem habe ich kurze Zeit später behoben, indem ich ---ACHTUNG:
    TRichEdit einfach gegen TMemo ausgetauscht habe.
    Einziger Zusatz war, dass ich die getOutput()-Rückgabe an die "Zeilenumbruch-Macke" für's TMemo angepasst habe ('\n' zu "\r\n").

    Was soll ich denn nun davon halten? Habe ich mal wieder irgendwo eine kleine Spitzfindigkeit nicht berücksichtigt, sei es im eigenen Code, irgendeiner VCL-eigenen Geschichte, oder gar etwas in der WINAPI* ??? Ich weiß es nicht.
    Es funktioniert jetzt jedenfalls einwandfrei.

    *Ich habe es sogar gewagt die VCL zu umgehen und in einem MyRichEdit-Derivat die WINAPI direkt zu benutzen: Gleiches Resultat

    Hier noch mal der geänderte Code:

    btw: 
    
    void __fastcall TXController::WriteWindow(string text, const TMemo* win :warning: , HANDLE mutex)
    {
            if (text.size()>0)
            {
                    replaceLinefeed(text); :warning: 
                    WaitForSingleObject(mutex, INFINITE);
                    // folgende Änderunge sind eher irrelevant
                    win->Text=win->Text + text.c_str();
                    win->Perform(EM_LINESCROLL,0, win->Lines->Count-1 );
                    ReleaseMutex(mutex);
            }
    }
    

Anmelden zum Antworten