non modal Dialog in einem Thread createn?



  • Willst du bei jedem Socketempfang einen neuen Hauptdialog erstellen? Oder ist der nicht modale Dialog ein anderer bzw. ein zweiter?
    Theoretisch dürfte das nochmalige Aufrufen des Hauptdialogs gehen...Muss aber auch zuerst auschecken.

    Auf Codeproject steht das Create aber im Konstruktor des aufzurufenden, zweiten Dialogfelds...

    Ich poste dir am besten doch mal das Wichtigste von meinem Demoprojekt

    ich will ja nicht mehrere male den hauptdialog (CtestDlg) erstellen sondern habe 1 hauptdialog, und der thread erzeugt mehrere dialoge(Send_Dialog)...also ein anderer!!

    cu



  • hi!
    kannst du mir mal dein beispiel mailen an: 5aht@gmx.at ....hab das gefühl das liegt eher am compiler...hab den mvc 7.1 ...
    weil das codeproject demo funzt auch nicht...beim ausführen gibs nen absturz;-(

    für was brauchst du das void CMyDialog::OnTimer(UINT nIDEvent ...) ?

    cu



  • Hmm...

    Na ja, ich habe mein Beispiel mit VC6.0 erstellt..Mal sehen, ob's klappt...
    Die OnTimer Methode ist nur noch pro Forma drin...Habe da mal noch was ausprobiert... 😃
    Nur nicht irritieren lassen...

    Gruz Dan



  • hi,
    das klappt;-) komisch*g*
    warum brauchst du da ne DialogThreadDlg.h u .cpp und ne DialogThread.h u .cpp

    MyDialog ist ja der Dialog den du beim anklicken auf den button aufmachen willst...und MyThread ist der thread...

    bye...big thx!!!



  • warum brauchst du da ein:

    extern CDialogThreadApp theApp;
    

    ??

    cu



  • Hi...

    warum brauchst du da ne DialogThreadDlg.h u .cpp und ne DialogThread.h u .cpp

    DialogThread.h und .cpp ist die Klasse in der der Hauptdialog meiner Anwendung inititalisiert wird.
    DialogThreadDlg.h und .cpp ist die Klasse des HAUPTDIALOGS. Meine Applikation wurde als dialogfeldbasierende Anwendung erstellt.

    MyDialog ist ja der Dialog den du beim anklicken auf den button aufmachen willst

    Genau. Der Button liegt jedoch noch auf dem HAUPTDIALOG. Und den Code zum Button findest du in der Klasse DialogThreadDlg.
    Wenn dieser Button gedrückt wird, werden 5 Threads nacheinander gestartet und JEDER EINZELNE THREAD erzeugt ein neues Dialogfeld. Jedes im jeweiligen Thread erzeugte Dialogfeld ist nicht modal und eine Instanz von der Klasse MyDialog. Jedes der Dialofelder läuft nachher IN einem separaten Thread.

    Das bedeutet: MyDialog ist also ein ZWEITES Dialogfeld mit einer eigenen, separaten Klasse.

    warum brauchst du da ein:
    C/C++ Code:
    extern CDialogThreadApp theApp;

    Na ja, ich erzeuge eine Instanz der Klasse DialogThread global, damit ich überall auf die jeweiligen Threads Zugriff habe. Dies ist vorallem wichtig, wenn du von irgendwoher einen Thread wieder löschen musst.

    Gruz

    Dan



  • 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