Threads
-
auch mit return TRUE; startet die applikation nicht
startet nicht:
BOOL CTestAppApp::InitInstance() { CWinThread *thread = AfxBeginThread(RUNTIME_CLASS(CMain)); //thread->Run(); return TRUE; } BOOL CMain::InitInstance() { CMainFrame* pFrame = new CMainFrame; if (!pFrame) return FALSE; m_pMainWnd = pFrame; pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE, NULL, NULL); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); //this->Run() return TRUE; }hab auch die anderen moeglichkeiten wie mein letztes post zeigt probiert mit return TRUE, welches das selbe verhalten aufweist
-
Was macht der Hauptthread?
Schick mir doch mal einen Link für Dein Projekt, dann kann ich mir das mal heute Abend in Ruche ansehen.
-
Vielen vielen dank fuer deine geduld
schau mal hier:
Klick
CTestApp:CWnd -> CMain:CWinThread -> CMainFrame:CFrameWnd -> CLeft:CFormView|CRight:CFormView
-
Beim Debugging wird folgende Meldung ausgegeben:
Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.
Man muss also auch m_pMainWnd von CTestAppApp auf irgendetwas zeigen lassen. Im Thread könnte das allerdings schon zu spät sein.
-
wenn ich "m_pMainWnd" auf "thread" verweise, wird die app zwar gestartet, aber nun wieder das problem dass das programm sich nicht richtig beendet, dh der prozess bleibt aktiv
-
Der Hauptthread muss natürlich in irgend einer Weise warten...
Bitte beachtet das m_pMainWin in jedem CWinThread Objekt existiert, also im CWinApp und im CWinThread!
-
da schwebt n riesen fragezeichen ueber mein kopf
-
Mr Evil schrieb:
da schwebt n riesen fragezeichen ueber mein kopf
Bzgl. was?
Also Dein erzeugter CWinThread hat ein m_pMainWnd und Dein CWinApp ist von CWinThread abgeleitet und hat auch ein m_pMainWnd Member.
Alle CWinThread (ob CWinApp oder anderes) verhalten sich immer gleich.
- Bei Start wird InitInistance geladen. Returniert die Funktion FALSE wird Thread/Applikation beendet.
- Wird TRUE returniert wird Run aufgreufen wenn ein m_pMainWnd vorhanden ist.
- Der Thread terminiert wenn das m_pMainWnd zerstört wird.Egal ob CWinApp oder GUI Thread.
Wenn Dein Main Thread jetzt einen neuen GUI Thread startet, dann muss der Mainthread ja nun was tun wenn er InitInstance verlässt. Entweder er wartet auf den anderen Thread, oder er erzeugt selber ein Fenster und geht in den Run, nachdem InitInstance beendet wurde.
So schwer?

-
also theoretisch glaub ich das zu verstehen, aber ich weiss nicht wie ich das in meiner app umsetzen muss
ich hab derzeit das m_pMainWnd auf den thread verwiesen direkt nach den AfxBeginThread in der CTestApp
nun laeuft die applikation, aber ich weiss nichts, laeuft sie auch in nem thread, ich glaube nicht, denn nach beenden laeuft die exe weiter sodass ich sie im taskmanager killen muss// generell ist das mein problem, ich les "starte danach das" - dann stell ich mir die frage, WO und WIE
ich weiss die ganze zeit so gut wie nie wo genau ich was machen muss, in den Init von der einstiegsklasse, oder dich in der WinThread klasse, oder gar noch spaeter, wenn ja, was muss ich vorher machen usw
darum hatte ich ja die TestApp geadded
-
Dann frage ich mal grundsätzlich: Für was willst Du denn den GUI-Thread verwenden, wenn Dein Mainthread keine GUI hat.
Ich verstehe Deine Absicht nicht.
2 GUI-Threads können Sinn machen, müssen aber nicht.
-
was verstehst du unter mainthread ?
die CMain:CWinThread klasse erstellt doch die MainFrame klasse und dieses zeigt zwei formviews in einen splitterschau dir doch ma die TestApp an die ich hier zum DL reingestellt habe - koenntest du die anpassen das das mainframe und die dazugehoerigen formview klassen in einem thread laufen?
mir fehlt mitlerweile jeglicher ansatz, und hab auch keine idee mehr was ich noch probieren koennte,
je mehr ich hier les desto weniger weiss ich was ich wo machen muss damit das mainframe in einem thread laeuft #sftzich habe eine
CTestApp:CWnd welche ein CMainFrame:CFrameWnd klasse aufruft, diese wiederrum besitzt einen splitter mit zwei CFormView fenstern
diese oberflaeche brauch ich in einem thread
mein versuch eine CMain:CWinThread dazwischen zu schalten brachte bisher keine erfolge, zu sehen an der TestApp2
ich raff den scheiss einfach nich, also wie ich dieses doofe mainframe in einem thread bekomm
-
wisst ihr was, ich machs nun so
ich mach die app erstma ohne multithread weiter {das was lange dauert ist ja bereits fertig}
ist noch genug zu tunund sobald das alles laeuft, versuch ich nocheinmal die aufrufe in nem workter thread auszulagern
also
OnCall
OnUpdate
OnFinished uswvielen dank trotzdem
-
Also ich erzähle Dir mal die Geschichte Deiner Applikation:
1. Dein Programm startet. DU hast einen Thread (Der Main Thread).
2. CTestAppApp::InitInstance() wird ausgeführt.
3. Der neue Thread startet.Ab jetzt hast Du 2 Threads, den 1. Thread von CTestAppApp und den zweiten von CMain. D.h. jetzt läuft einiges parallel.
CMain:
4. CMain::Initinstance erzeugt Fenster.
5. CMain::Run läuftCTestAppApp:
5. InitInstance returniert, aber es gibt kein Fenster.
6. Kein Run läuft an. ExitInstance wird ausgeführt.
7. Die Applikation terminiert brutal, alles.Es bleiben Leaks.
Bau mal ein AfxMessageBox in Dein InitInstance nach dem Threadstart ein.
Und wundere Dich was passiert!
-
interessant - echt - trotzdem weiss ich nicht wie es nun richtig geht {o;
-
Präzisiere was Du nicht verstehst. Ich habe doch beschrieben was passiert.
Ich weiß immer noch nicht was Du eigentlich willst!
Warum willst Du einen zweiten GUI Thread?
Was ist der Sinn hinter dem Ganzen?
Warum baust Du nicht eine normale Windows Applikation und lagerst die "Arbeit" in einen Workerthread aus. Der hat dann keine Fenster und auch keine Messageloop.
-
willst du etwa sagen, wenn ich eine SDI app vom wizard erstellen lass - laeuft dieser bereits in einem thread ???
wenn ja dann hab ich was verpasst - dann isses klar das ich kein zweiten brauchmit den worker threads hab cih eh spaeter vor, siehe mein vorletzten post
-
Mr Evil schrieb:
willst du etwa sagen, wenn ich eine SDI app vom wizard erstellen lass - laeuft dieser bereits in einem thread ???
wenn ja dann hab ich was verpasst - dann isses klar das ich kein zweiten brauchmit den worker threads hab cih eh spaeter vor, siehe mein vorletzten post
So ist es. Alles was Code ausführt ist entweder ein Thread oder ein Fiber...
Somit startet ein Prozess mit einem Thread und existiert so lange bis einer ExitProcess aufruft oder der letzte Thread terminiert.
Technisch gesehen gibt es auch keine Main-Thread. Man sagt das nur gerne zu dem Thread, der als erstes gestartet ist.
Ob Du nun einen neuen Thread brauchst oder nicht, kann ich Dir nicht sagen, auf jeden Fall besteht ein Prozess aus mindestens einem Thread...
-
achsooooooooooo - jetzt wird einiges klarer warum du so verwirrt bist
die app laeuft bereits in diesem "MainThread" und ich habe versucht in diesem thread die oberflaeche in einen zweiten thread laufen zu lassenok dann ergibt das kein sinn #gg
wie gesagt, ich hab erstmal andere sachen noch zu erledigen und versuch mich dann an nem worker thread fuer die aufrufe
vielen vielen dank