DeBrainBoy Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Hallo Ihrs! Hab wiedereinmal ein Problem mit meinem Programm! Umgebung: Visual C++ 6.0 Folgendes: Ich muß Logs nach Domainnamen splitten (Testdateien mit bis zu 50MB Größe). Aus einem Log werden dann ca. 6 andere kleine Logs! Nun mein Problem, sobald ich auf splitten klicke, fängt das Programm ganz normal mit der Verarbeitung an! ABER das Programm ist nun nicht mehr aktiv! Das heißt ich kann es weder verschieben noch sehen wenn ich zwischendurch ein anderes Fenster öffne! Die CPU Last liegt auf 100% und im Task Manager steht "Keine Rückmeldung"! ABER das Programm arbeitet ohne Probleme! Keine Fehler, nix! Sobald alle Logs verarbeitet sind, steht mir das Programm sofort wieder zur Verfügung! Wie kann ich da Abhilfe schaffen?? Muß doch irgendwie gehen oder?? Schonmal vielen Dank für Eure Antworten und bis dann **DeBrainBoy** Zitieren
Klotzkopp Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Der TaskManager von Windows hat seine ganz eigene Auffassung von Prozesszuständen. 'Wird ausgeführt' bedeutet eigentlich 'Wartet', und 'Keine Rückmeldung' heißt soviel wie 'Hat viel zu tun'. Dass Dein Programm, nicht mehr reagiert während es arbeitet, liegt daran, dass der einzige Thread Deiner Anwendung beschäftigt ist. Wenn Du das umgehen willst, dann musst Du einen weiteren Thread starten, der dann die Arbeit erledigt (einen Worker-Thread, wie MS das nennt). Dann kann der erste Thread (der User-Interface-Thread) weiterhin dafür sorgen, dass das Fenster sich so verhält, wie man es von einem Fenster erwartet. Dann ist auch der TaskManager zufrieden. Ein zweiter Thread bringt allerdings einige neue Probleme mit sich. Der 'Splitten'-Button (oder Menü-Eintrag, was auch immer) muss auf 'disabled' gesetzt werden, damit man nicht noch einen dritten Thread starten kann, während der zweite noch läuft. Außerdem solltest Du verhindern, dass das Programm beendet wird, während der Worker-Thread noch läuft, damit die Anwendung in einem definierten Zustand terminiert. Zitieren
DeBrainBoy Geschrieben 24. Oktober 2001 Autor Geschrieben 24. Oktober 2001 Erstmal danke für die schnelle Antwort! Bleibt nur eine Frage: Wie mache ich einen zweiten Thread?? Danke und Gruß **DeBrainBoy** Zitieren
Klotzkopp Geschrieben 24. Oktober 2001 Geschrieben 24. Oktober 2001 Also als erstes brauchst Du eine Thread-Funktion. Rückgabetyp und Parameter sind hierbei festgelegt. Die Thread-Funktion muss entweder global oder statisch sein, damit kein zusätzlicher this-pointer mit übergeben wird. Damit die Thread-Funktion auf die Member Deiner Klasse zugreifen kann, übergibt man meist einen this-Pointer an einen "Threadstart-Funktion", die dann die eigentliche Threadfunktion aufruft. // YourDlg.h class CYourDlg : public CDialog: ... static UINT __stdcall tmpWorkerThread( void* pParam ); void WorkerThread(); ... // YourDlg.cpp UINT CYourDlg::tmpWorkerThread( void* pThis ) { CYourDlg* pDlg = (CYourDlg*) pThis; pDlg->WorkerThread(); } void CYourDlg::WorkerThread() { // was auch immer getan werden muss } [/code] Den Thread startest Du dann mit [code] HANDLE hThread = (HANDLE) _beginthread( tmpWorkerThread, 0, this); CloseHandle( hThread ); Ganz wichtig, leider hab ich die Namen hier nur auf Englisch: In den Projekt-Settings, Register C/C++, Use run-time library: eine Multithreading-Runtime auswählen, in Deinem Fall vermutlich am besten "Debug Multithreaded DLL". Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.