Programm lässt sich nicht bedienen...



  • Hallo,

    ich verstehe das ganze noch nicht so richtig.

    Wenn ich den Thread starte, läuft er ja im Hintergrund.

    Mein Programm macht diese Ausgaben:

    Wenn Button gedrückt
    - Abfrage sind Sie sicher
    - Ausgabe "Starte..."
    - Ausgabe "Formatiere Sector x von y..."
    - Ausgabe "Fertig"

    Wenn ich jetzt den Thread nach "Starte..." aufrufe, dann sehe ich sofort "Fertig..."

    Ausserdem: Der Thread hat keinen Zugriff auf die 100 Variablen die ich brauche...

    Ich habe in den FAQ gerade etwas von einem Timer gelesen, wäre das nicht einfacher?

    mfg
    trequ



  • #Doppelpost#



  • Wenn ich jetzt den Thread nach "Starte..." aufrufe, dann sehe ich sofort "Fertig..."

    schon mal dran gedacht "Fertig..." auszugeben wenn fertig ist, also am ende des threads (nicht nach AfxBeginThread) 🤡



  • schon mal dran gedacht "Fertig..." auszugeben wenn fertig ist, also am ende des threads (nicht nach AfxBeginThread) 🤡

    😃

    Ausserdem: Der Thread hat keinen Zugriff auf die 100 Variablen die ich brauche...

    "Zugriff" hast du indem du den der Threadfunktion übergebenen "Zeiger" castest und mittels diesen dann die members ansprichst...

    also angenommen du hast die Klasse A erstellt und jedes Objekt dieser Klasse bekommt ein member b...
    dann kannst du innerhlab deiner Threadfunktion so arbeiten

    UINT A::ThreadFunction(LPVOID pParam){ 
    
    A* p = (A*)pParam; 
    p->b; //zugriff auf b 
    .
    .
    .
    


  • Hallo,

    danke schon mal, das hat mir weiter geholfen.

    ABER:

    for(int i = 0; i < sectorcnt; i++){
        output.Format("Erasing sector %d of %d...", i, sectorcnt);
        m_statustext = output;
        m_statusbar.SetPos(i);
        UpdateData(false); 
        WriteSector(device, 0, 1, data);    
    }
    

    Erzeugt Debug Assertion Failed....

    Wenn ich UpdateData(false) auskommentiere, geht es.

    Steht auch hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=79295&highlight=afxbeginthread&start=10

    Was nun?

    Danke schon mal...

    mfg
    trequ



  • Auf ein fenster darf immer nur der Thread der es erstellt hat direkt zugeifen und UpdateData greif direkt darauf zu



  • CMatt schrieb:

    Auf ein fenster darf immer nur der Thread der es erstellt hat direkt zugeifen und UpdateData greif direkt darauf zu

    Ja, schon klar.

    Aber was mach ich jetzt dagegen???

    Auf der Seite
    http://www.c-plusplus.net/forum/viewtopic.php?t=79295&highlight=afxbeginthread&start=10
    steht:

    Der andere leitet sich von der Klasse CWinthread ab.
    Diesem kann man den this-Zeiger des Dialogs übergeben und dann gegebenefalls Steuerelemente updaten. Manchmal muss man zwar Sync aber dies ist ein generelles Threadproblem.

    Ich kann also this->UpdateData(false); aufrufen, wenn ich den Zeiger habe?

    Wie komme ich an den Zeiger?

    mfg
    trequ



  • Also wenn du einfach nur nen Text setzten willst würde ich dir SendMessage(...,WM_SETTEXT,0,text) empfehlen.



  • Hallo,

    das sieht doch gut aus...

    Wenn ich bitte die Syntax kriegen kann...???

    SendMessage(m_statustext, WM_SETTEXT, 0, "TEST");
    

    mag er irgendwie nicht.

    Was ist er 1. Parameter?
    Laut MSDN: "handle to destination control" -> das bedeutet?

    Danke.

    mfg
    trequ



  • das ist der Handle auf dein Steuerelement das du updaten möchtest...
    weiss jetzt nicht aus dem hut wie du an den rankommst einfach mal in der msdn gucken... Ich glaub wenn dein Steuerelement von CDialog abgelitten ist dann gibts auch jeden fall die membervariable m_hWnd die du verwenden könntest...


Anmelden zum Antworten