Wielowątkowość: tworzenie wątków interfejsu użytkownika MFC
Wątek interfejsu użytkownika jest często używany do obsługi danych wejściowych użytkownika i reagowania na zdarzenia użytkownika niezależnie od wątków wykonujących inne części aplikacji. Główny wątek aplikacji (podany w CWinApp
klasie pochodnej) został już utworzony i uruchomiony. W tym temacie opisano kroki niezbędne do utworzenia dodatkowych wątków interfejsu użytkownika.
Pierwszą rzeczą, którą należy zrobić podczas tworzenia wątku interfejsu użytkownika, jest utworzenie klasy z CWinThread. Należy zadeklarować i zaimplementować tę klasę przy użyciu makr DECLARE_DYNCREATE i IMPLEMENT_DYNCREATE . Ta klasa musi zastąpić niektóre funkcje i może zastąpić inne. Te funkcje i czynności, które należy wykonać, przedstawiono w poniższej tabeli.
Funkcje do zastąpienia podczas tworzenia wątku interfejsu użytkownika
Function | Purpose |
---|---|
ExitInstance | Wykonaj oczyszczanie po zakończeniu wątku. Zwykle przesłaniane. |
InitInstance | Wykonaj inicjowanie wystąpienia wątku. Należy przesłonić. |
OnIdle | Wykonywanie przetwarzania bezczynności specyficznego dla wątku. Zwykle nie są zastępowane. |
PreTranslateMessage | Filtruj komunikaty przed ich wysłaniem do TranslateMessage i DispatchMessage . Zwykle nie są zastępowane. |
ProcessWndProcException | Przechwyć nieobsługiwane wyjątki zgłaszane przez programy obsługi komunikatów i poleceń wątku. Zwykle nie są zastępowane. |
Run | Sterowanie funkcją wątku. Zawiera pompę komunikatu. Rzadko przesłaniane. |
MFC udostępnia dwie wersje przeciążenia parametrów AfxBeginThread
: jeden, który może tworzyć tylko wątki robocze i jeden, który może tworzyć wątki interfejsu użytkownika lub wątki procesów roboczych. Aby uruchomić wątek interfejsu użytkownika, wywołaj drugie przeciążenie elementu AfxBeginThread, podając następujące informacje:
(Opcjonalnie) Żądany poziom priorytetu. Wartość domyślna to normalny priorytet. Aby uzyskać więcej informacji na temat dostępnych poziomów priorytetu, zobacz SetThreadPriority w zestawie Windows SDK.
(Opcjonalnie) Żądany rozmiar stosu dla wątku. Wartość domyślna to ten sam stos rozmiaru co wątek tworzenia.
(Opcjonalnie) CREATE_SUSPENDED, jeśli chcesz, aby wątek został utworzony w stanie wstrzymania. Wartość domyślna to 0 lub zwykle uruchamiać wątek.
(Opcjonalnie) Żądane atrybuty zabezpieczeń. Wartość domyślna to ten sam dostęp co wątek nadrzędny. Aby uzyskać więcej informacji na temat formatu tych informacji o zabezpieczeniach, zobacz SECURITY_ATTRIBUTES w zestawie Windows SDK.
AfxBeginThread
wykonuje większość pracy dla Ciebie. Tworzy nowy obiekt klasy, inicjuje go przy użyciu podanych informacji i wywołuje element CWinThread::CreateThread , aby rozpocząć wykonywanie wątku. Kontrole są wykonywane w całej procedurze, aby upewnić się, że wszystkie obiekty są prawidłowo cofnięte, jeśli jakakolwiek część tworzenia zakończy się niepowodzeniem.