Udostępnij za pośrednictwem


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 CWinAppklasie 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 Cel
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:

  • RUNTIME_CLASS klasy pochodzącej z CWinThreadklasy .

  • (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.

Co chcesz dowiedzieć się więcej?

Zobacz też

Wielowątkowość z C++ i MFC