non modal Dialog in einem Thread createn?



  • danke;-)

    also im thread erzeuge ich einen dialog mit m_pMainWnd->ShowWindow(SW_HIDE);
    wie kann ich nun aus dem hauptdialog (zb.: ich mach nen 2 button dazu, dann:) sagen m_pMainWnd->ShowWindow(SW_SHOW);???
    oder vom hauptdialog aus in einem dialog irgendwas in ein textfeld schreiben?

    wenn das geht..perfekt;-)

    cu



  • Hi

    Da musste die Threads ein wenig anders erzeugen:

    theApp.m_pThread[i]=(CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
    

    Nun solltest du auf die Variablen und Instanzen der jeweiligen Threadinstanz Zugriff haben.

    Also zum Beispiel das Dialogfeld im Thread 1:

    theApp.m_pThread[0]->DeinDialog->ShowWindow(SW_SHOW); oder so...
    

    Hoffe das klappt so...Probiers mal aus... 😃 😃 😃

    Gruz

    Dan



  • hi,
    du hast das CWinThread* m_pThread[5]; in der klasse CDialogThreadApp!

    ich brauche CWinThread* m_pThread[5]; aber in der klasse CDialogThreadDlg!!!

    wie mach ich das dann am besten? ein GetParent?

    cu



  • hi,

    hab noch ne frage...

    ich will ja daten von nem socket empfangen...das läuft in einem thread mit ner endloschleife...der thread bekommt einen pointer auf die hauptklasse...
    ich lege jetzt in diesem thread neue AfxThreads an, wenn ich einen neuen dialog erzeugen will...da der thread ja nachrichtenbasierend ist, muss ich den ja nachrichten schicken, wenn ich zb in ein editfeld etwas schreiben will...
    in der hauptklasse hab ich das array mit den pointern auf die threads...jedoch weiss ich da nicht wie ich da aus diesen thread, der ja einen pointer auf die hauptklasse hat ne methode zb.: void Show_Window(....) aufrufen kann, die der ThreadKlasse gehört!?

    wie findest du das konzept?

    cu



  • du hast das CWinThread* m_pThread[5]; in der klasse CDialogThreadApp!
    ich brauche CWinThread* m_pThread[5]; aber in der klasse CDialogThreadDlg!!!

    Das geht, wenn du eine globale Instanz deklariert hast (Von der CDialogThreadApp)
    Siehe Beitrag um 10.07 von heute...

    ich lege jetzt in diesem thread neue AfxThreads an, wenn ich einen neuen dialog erzeugen will...da der thread ja nachrichtenbasierend ist, muss ich den ja nachrichten schicken, wenn ich zb in ein editfeld etwas schreiben will...

    Musst du nicht. Initialisiere den jeweiligen Thread so, wie ich's bereits beschrieben habe (Beitrag 11.57 von heute). Dann solltest du direkt auf die jeweilige Membervariable des bestimmten Editfelds zugreifen können.

    in der hauptklasse hab ich das array mit den pointern auf die threads...jedoch weiss ich da nicht wie ich da aus diesen thread, der ja einen pointer auf die hauptklasse hat ne methode zb.: void Show_Window(....) aufrufen kann, die der ThreadKlasse gehört!?

    Das sollte aber möglich sein...Siehe wieder Beitrag um 10.07 von heute...
    Geht da nicht irgenwie sowas wie (im Socketthread):
    Wenn du das Array mit den Pointern nicht globalisierst, dann sollte doch das so gehen: DeinPtraufHauptklasse->m_pThread[2]->m_xy.Format("blah");

    Wenn der Socketthread immer läuft, dann kannste das glaub ich schon so machen...
    Gib mir mal n'Feedback, wenn's läuft... 😃

    Gruz Dan



  • ich lege jetzt in diesem thread neue AfxThreads an, wenn ich einen neuen dialog erzeugen will...da der thread ja nachrichtenbasierend ist, muss ich den ja nachrichten schicken, wenn ich zb in ein editfeld etwas schreiben will...

    Musst du nicht. Initialisiere den jeweiligen Thread so, wie ich's bereits beschrieben habe (Beitrag 11.57 von heute). Dann solltest du direkt auf die jeweilige Membervariable des bestimmten Editfelds zugreifen können.

    hatte heute ne diskussion mit jemanden, der sagte folgendes:

    wenn du von einem Thread auf einem Formular in einem anderen Thread (bei dir der App-Thread) zugreifst, muss die sache in die Hose gehen
    du kannst in einem Thread nur auf Sachen zugreifen, die auch in deinem Thread erstellt wurden
    die App gehört sicherlich nciht dazu
    ein ausweg wäre die Syncronisierung deines Workerthreads mit den Hauptthread
    so dass die Threads gleich laufen
    also als ein Thread angesehen werden können.
    dann darfst du zugreifen.
    die Syncronisation ist aber immer etwas schwierig.
    es geht, aber wenn man das umgehen kann, vermeidet man das
    weil mit einer Syncronisation natürlich auch die parallelität nicht mehr da ist
    du hebs den eigentlichen zweck des Threads auf
    das kann man umgehen indem man das Processmodel von Windows nutzt
    alle Nachrichtenschleifen werden vom Prozess und dem App-Thread der Anwendung gesteuert. Diese müssen nciht syncronisert werden.
    man muss sich das wie ein Stack vorstellen
    du packst mit SendMessage eine Nachricht auf den Schleifenstapel
    und die Anwendung / Formular nimmt sich die Nachrichten von unten immer nacheinander weg
    das führt zu einer indirekten syncronisation ein SendMessage- Aufruf muss also nicht synconisiert werden
    AndreasW folglich bleibt der Thread auch voll funktionsfähig
    und wird nicht ausgebremst

    also sowas:

    SendMessage (EditBoxHandel, SET_TEXT, "Mein Text");
    so brauchst du nciht mal nen Pointer auf das Formular
    
    mit #defin WM_MYRECIVEMESSAGE
    mit #define WM_MYRECIVEMESSAGE
    dann eine struct oder class
    und mit dieser WM_MYRECIVEMESSAGE an das Handle von der CWinApp-Instanz schicken (mit SendMessage)
    dort ein fenster aufmachen und anzeigen
    überlass die Organisation der Fenster dem Hauptthread ist besser
    
    CWinApp ist überigens von CWinThread abgeleitet
    m_hThread ist dann überigens das Handle des Hauptthreads
    
    wie kommt man aufs App-Handle?
    

    ps.: hab deine variante noch nicht probiert, da ging vorher noch was schief!!
    cu



  • hi, es funzt nun....ich sende einfach eine PostMessage aus dem thread an den Hauptdialog....PostMessage ruft eine funktion auf und der erstellt mir dann den dialog,-) geht ja viel einfacher;-) aber danke noch mal....zu viele threads sind sowieso nie gut...

    cu


Anmelden zum Antworten