Реализация многопоточности на языке C++ с помощью классов MFCMultithreading with C++ and MFC

Библиотека Microsoft Foundation Class (MFC) обеспечивает поддержку многопоточных приложений.The Microsoft Foundation Class (MFC) library provides support for multithreaded applications. В этом разделе описываются процессы и потоки, а также подход MFC к многопоточности.This topic describes processes and threads and the MFC approach to multithreading.

Процесс — это исполняемый экземпляр приложения.A process is an executing instance of an application. Например, если дважды щелкнуть значок «Блокнот», запускается процесс, запускающий Блокнот.For example, when you double-click the Notepad icon, you start a process that runs Notepad.

Поток — это путь выполнения внутри процесса.A thread is a path of execution within a process. При запуске блокнота операционная система создает процесс и начинает выполнять основной поток этого процесса.When you start Notepad, the operating system creates a process and begins executing the primary thread of that process. При завершении этого потока процесс выполняется.When this thread terminates, so does the process. Этот основной поток предоставляется операционной системе кодом запуска в виде адреса функции.This primary thread is supplied to the operating system by the startup code in the form of a function address. Обычно это адрес main WinMain предоставляемой функции или.Usually, it is the address of the main or WinMain function that is supplied.

При необходимости в приложении можно создавать дополнительные потоки.You can create additional threads in your application if you want. Это может потребоваться для обработки фоновых или служебных задач, если не нужно, чтобы пользователь ожидал их завершения.You might want to do this to handle background or maintenance tasks when you do not want the user to wait for them to complete. Все потоки в приложениях MFC представлены объектами класса CWinThread .All threads in MFC applications are represented by CWinThread objects. В большинстве случаев вам даже не нужно явно создавать эти объекты. Вместо этого вызовите вспомогательную функцию платформы афксбегинсреад, которая создает CWinThread объект.In most situations, you do not even have to explicitly create these objects; instead call the framework helper function AfxBeginThread, which creates the CWinThread object for you.

MFC различает два типа потоков: потоки пользовательского интерфейса и рабочие потоки.MFC distinguishes two types of threads: user-interface threads and worker threads. Потоки пользовательского интерфейса обычно используются для управления вводом пользователя и реагирования на события и сообщения, созданные пользователем.User-interface threads are commonly used to handle user input and respond to events and messages generated by the user. Рабочие потоки обычно используются для выполнения задач, таких как пересчет, которые не нуждаются в вводе данных пользователем.Worker threads are commonly used to complete tasks, such as recalculation, that do not require user input. API Win32 не различает типы потоков. необходимо только выяснить начальный адрес потока, чтобы он мог начать выполнение потока.The Win32 API does not distinguish between types of threads; it just needs to know the thread's starting address so it can begin to execute the thread. MFC обрабатывает потоки пользовательского интерфейса особым образом, предоставляя конвейер сообщений для событий в пользовательском интерфейсе.MFC handles user-interface threads specially by supplying a message pump for events in the user interface. CWinApp — Это пример объекта потока пользовательского интерфейса, поскольку он является производным от класса CWinThread и обрабатывает события и сообщения, созданные пользователем.CWinApp is an example of a user-interface thread object, because it derives from CWinThread and handles events and messages generated by the user.

Особое внимание следует уделить ситуациям, когда более чем одному потоку может потребоваться доступ к одному и тому же объекту.Special attention should be given to situations where more than one thread might require access to the same object. Многопоточность. Советы по программированию описывают методы, которые можно использовать для решения проблем, которые могут возникнуть в таких ситуациях.Multithreading: Programming Tips describes techniques that you can use to get around problems that might arise in these situations. Многопоточность. Использование классов синхронизации описывает, как использовать классы, доступные для синхронизации доступа из нескольких потоков к одному объекту.Multithreading: How to Use the Synchronization Classes describes how to use the classes that are available to synchronize access from multiple threads to a single object.

Написание и Отладка многопоточного программирования по сути по-своему сложнее, так как необходимо обеспечить недоступность объектов в нескольких потоках за один раз.Writing and debugging multithreaded programming is inherently a complicated and tricky undertaking, because you must ensure that objects are not accessed by more than one thread at a time. В разделах о многопоточном программировании не рассматриваются основы многопоточного программирования, а только использование MFC в многопоточной программе.The multithreading topics do not teach the basics of multithreaded programming, only how to use MFC in your multithreaded program. Многопотоковые примеры MFC, включенные в Visual C++, иллюстрируют несколько многопоточных функций добавления и API-интерфейсов Win32, не включенных в MFC. Однако они предназначены только для отправной точки.The multithreaded MFC samples included in Visual C++ illustrate a few multithreaded Adding Functionality and Win32 APIs not encompassed by MFC; however, they are only intended to be a starting point.

Дополнительные сведения о том, как операционная система обрабатывает процессы и потоки, см. в разделе процессы и потоки в Windows SDK.For more information about how the operating system handles processes and threads, see Processes and Threads in the Windows SDK.

Дополнительные сведения о поддержке многопоточности MFC см. в следующих разделах:For more information about MFC multithreading support, see the following topics:

См. также разделSee also

Поддержка многопоточности для устаревшего кода (Visual C++)Multithreading Support for Older Code (Visual C++)