In Thread auf Variable zugreiffen, wie genau?



  • Kann man dazu vielleicht mal einen kleinen Quelltextausschnitt bekommen um das mal zu sehn?

    Ich habe genau das selbe Problem, aber wie ich das jetzt richtig anwende weiß ich leider mit dem Hinweis von MFK noch nicht.

    Wäre für ein kleines Beispiel dankbar.

    Grüße



  • Was MFK sagen möchte ist folgendes :

    UINT ReceiverThreadFunc(LPVOID data)
    { 
       CCSTApp* pApp = (CCSTApp*) data;
    .
    .
    .
    

    Stimmt doch, oder ? 🤡

    Gruß
    :: NoName ::



  • MFK schrieb:

    Du kannst beim Erstellen des Threads einen beliebigen Zeiger angeben, der dann in data landet. Das kann auch ein Zeiger auf deine Dialoginstanz sein.

    Natürlich kann man dass machen aber du kannst mit dem Dialogpointer in dem Thread nichts anfangen weil er in der HandleMap des Threads unbekannt ist!!

    MfG Spacelord



  • Und würde man es dann besser machen?

    Außerdem hab ich dann mal noch die Frage, wie man einen Thread unterbrechen kann von außen, nicht innerhalb des Threads.

    Grüße



  • Spacelord schrieb:

    Natürlich kann man dass machen aber du kannst mit dem Dialogpointer in dem Thread nichts anfangen weil er in der HandleMap des Threads unbekannt ist!!

    Man kommt an die Member ran, darunter auch das HWND. Und dann kann man mit CWnd::FromHandle, CWnd::Attach oder ::PostMessage so ziemlich alles machen.



  • Mit PostMessage kann man alles machen das ist korrekt.
    CWnd::FromHandle liefert dir im fremden Thread einen Zeiger auf ein temporäres Objekt vom Typ CTempWnd.Das kannst du auch nicht nach dem Typ der Dialogklasse casten.Es ist ein CTempWnd Objekt!!
    Wenn überhaupt musst du ein lokales Objekt der Dialogklasse erstellen und dieses mit Attach(und dem m_hWnd der als Zeiger übergebenen Dialog Instanz)an das Kernel"objekt" binden.Nur dann ist das Objekt in der permanenten HandleMap des Threads und nur dann hat das Objekt auch den korrekten Typ.
    Und selbst wenn du das machst;dann hast du 2 MFC Objekte,in 2 Threads, die sich auf die gleiche Kernel WND Struktur beziehen und du meinst nicht das da das eine oder andere klitzekleine Synchronisationsproblem auftritt?
    Ich bin mir ziemlich sicher dass du weisst was du machst aber wenn du einem Threadunerfahrenen nur kurz hinwirfst dass er "einfach" nur den Zeiger auf seine Dialoginstanz übergeben muss dann geht dieser doch ganz klar davon aus dass es damit getan ist und er in dem Thread ganz normal damit arbeiten kann.
    Das ist ja nunmal nicht so.
    Also wenn du schon was postest,dann nimm dir auch die Zeit den ganzen Sachverhalt zu erläutern und nicht irgendwelche Halbwahrheiten zu verbreiten.
    Meine Meinung....

    MfG Spacelord



  • Spacelord schrieb:

    CWnd::FromHandle liefert dir im fremden Thread einen Zeiger auf ein temporäres Objekt vom Typ CTempWnd.Das kannst du auch nicht nach dem Typ der Dialogklasse casten.Es ist ein CTempWnd Objekt!!

    Habe ich etwas anderes behauptet? Dein Kritikpunkt war, dass man mit dem Dialogzeiger nichts anfangen kann, weil das Objekt nicht in der Handlemap ist. FromHandle trägt das Objekt in der temporären Handlemap des Threads ein.

    Und selbst wenn du das machst;dann hast du 2 MFC Objekte,in 2 Threads, die sich auf die gleiche Kernel WND Struktur beziehen und du meinst nicht das da das eine oder andere klitzekleine Synchronisationsproblem auftritt?

    Wiederum: Habe ich behauptet, dass keine Probleme auftauchen? Du hast bemängelt, dass das Objekt nicht in der Handlemap ist, ich habe aufgezeigt, wie man es reinbekommt. Mehr nicht.

    Ich bin mir ziemlich sicher dass du weisst was du machst aber wenn du einem Threadunerfahrenen nur kurz hinwirfst dass er "einfach" nur den Zeiger auf seine Dialoginstanz übergeben muss dann geht dieser doch ganz klar davon aus dass es damit getan ist und er in dem Thread ganz normal damit arbeiten kann.

    Ich habe nicht "einfach" geschrieben. Wenn der Fragesteller das so aufnimmt, dann ist das ein Problem in der Denkweise des Fragestellers, das ich auch mit einer umfassenden Abhandlung über Threads und MFC nicht aus der Welt schaffe, und sei es nur aus dem Grund, dass er sie nicht liest, weil sie ihm zu lang ist. Aus dem gleichen Grund sind Verweise auf solche Artikel in der MSDN Library oft sinnlos. Meine Meinung.

    Also wenn du schon was postest,dann nimm dir auch die Zeit den ganzen Sachverhalt zu erläutern und nicht irgendwelche Halbwahrheiten zu verbreiten.

    Für wie umfassend hältst du "den ganzen Sachverhalt" zum Thema MFC und Threads?
    Ich habe nicht die Zeit, hier seitenweise über die Stolpersteine von Threads zu dozieren, und, wie oben bereits geschrieben, halte ich das auch nicht für sinnvoll, erstens weil aus der Frage gar nicht klar wird, ob dieser Aufwand notwendig ist, und zweitens, weil der Adressat das wahrscheinlich nicht liest oder nicht versteht oder nicht beherzigt. Ich versuche, mit meinen Beiträgen einen Denkanstoß zu geben und den Fragesteller in die richtige Richtung zu lenken.

    Den Vorwurf, Halbwahrheiten zu verbreiten, weise ich von mir. Unter keinem meiner Beiträge steht: "Das ist alles, was du zu dem Thema wissen musst, bitte ab jetzt Hirn abschalten und Doku weglegen."

    Mich würde aber interessieren, wie eine Antwort aussieht, die deinen Ansprüchen genügt, gerade was den "ganzen Sachverhalt" angeht. Gibst du ein Beispiel?



  • In einem weiteren Thread hatte dein Post bereits für "Verwirrung" gesorgt.
    Das du keine seitenlangen Artikel schreiben kannst/sollst/willst ist auch klar,aber zumindest ein kleiner Hinweis dass das Ganze doch etwas problematischer ist und nen Link wo man sich schlau machen kann wäre doch nicht zuviel verlangt,oder?
    In dem anderen Thread hab ich übrigens nen Link zu einem super Artikel über diese Theamtik gepostet.Ob derjenige den durchliest bleibt natürlich fraglich,das soll dann aber nicht mein Problem sein.

    MfG Spacelord



  • Spacelord@work schrieb:

    In einem weiteren Thread hatte dein Post bereits für "Verwirrung" gesorgt.

    In welchem?



  • Ich kann an der Antwort von MFK keine Fehler sehen.

    1. Threads sind nicht einfach und mit ein paar Zeilen nicht erklärt. Dies soll auch nicht die Aufgabe sein. Das muss der Frager schon selbsr rausfinden. Man kann ihm hinweisde geben wonach er suchen soll. Bei viele Fragen ist es mit ein paar Zeiulen erklärt. Nicht bei Threads. Es gibt in der Linksammlung auch genugen TUT dazu.

    2. Ist er nicht verpflichtet Links zu posten oder ähnliches. Er ist lediglich dazu angehalten richtig zu posten. Aber dem Umfang entscheidet er.

    Sollte der Frager damit probleme haben wird er eh weiterfragen.


Anmelden zum Antworten