000
16.01.2003, 20:38 Uhr
Uwe
C/C++ Master (Administrator)
|
Erstellt von FloSoft
Manchmal kommt es vor, dass man mehrere Aufgaben gleichzeitig in einer Anwendung erledigen muss (z.B. Musik abspielen, Datei schreiben, etc...). Man hat aber leider nur eine Hauptnachrichtenschleife zur Verfügung. Wie kann man dies realisieren? Man nimmt Arbeitsthreads. Hierzu eine kleine Demo: Für dieses Beispiel verwende ich ein MFC-Dialogfeldanwendungsprojekt (Standard) mit dem Projektnamen Thread. Beim erstellen der Anwendung ist unbedingt darauf zu achten, dass der mmsystem.h Header in das Projekt eingebunden wird und bei den Projekteinstellungen dem Linker die winmm.lib mitzuteilen ist. Zunächst legen wir einen CWinThread Pointer (Global! Wichtig!) an:
C++: |
CWinThread* unser_thread;
|
Als nächstes brauchen wir einen Funktion im Format UINT Funktionsname(LPVOID pParam): Diese legen wir per "Hand" an und fügen unter den Includanweisungen den Prototypen der Funktion ein, damit der Compiler weiß das die eigentliche Funktion an einer anderen Stelle im Programm folgt, falls diese vor der Definition aufgerufen wird.
C++: |
UINT PlayWave(LPVOID pParam);
|
Die eigentliche Funktion sieht wie folgt aus
C++: |
UINT PlayWave(LPVOID pParam) { CThreadDlg* m_dlg = (CThreadDlg*)pParam; /* Über m_dlg können wir nun auf die Funktionen und Variablen unseres Hauptthreads zugreifen */
PlaySound("C:\\windows\\media\\tada.wav", NULL, SND_ASYNC | SND_FILENAME | SND_LOOP);// Wave abspielen return 0; // Funktion verlassen }
|
Nun hätten wir beinahe das wichtigste Vergessen: Das Aufrufen des Threads! Dies realisieren wir so: Wir legen im Resourceeditor einen Button Namens "Thread starten" und mit der ID "IDC_START_THREAD" an. Dann erstellen wir über den Klassenassistenten eine BN-CLICKED-Funktion dieses Buttons:
C++: |
void CUnserProjekt::OnStartThread() { // Starten des Threads: unser_thread = AfxBeginThread(PlayWave,this); /* nun wird dem Threadpointer die Funktion mitgeteilt, welche er ausführen soll und als pParam this, also alle Memberfunktionen -variablen unseres Hauptthreads. */ }
|
Jetzt können wir kompilieren, wenn man startet und man auf den Button klickt, sollte nun ein ständiges "Tada" zu hören sein! Ein Thread wird automatisch beendet, wenn die Funktion verlassen wird. Um dies vorzeitig zu tun, verwendet man die Funktion
-- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe Dieser Post wurde am 16.01.2003 um 20:38 Uhr von Uwe editiert. |