Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.
Syntax
C++
HANDLE WINAPI CreateToolhelp32Snapshot(
_In_ DWORD dwFlags,
_In_ DWORD th32ProcessID
);
Parameters
dwFlags [in]
The portions of the system to be included in the snapshot. This parameter can be one or more of the following values.
Value
Meaning
TH32CS_INHERIT
0x80000000
Indicates that the snapshot handle is to be inheritable.
TH32CS_SNAPALL
Includes all processes and threads in the system, plus the heaps and modules of the process specified in th32ProcessID. Equivalent to specifying theTH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPPROCESS, and TH32CS_SNAPTHREAD values combined using an OR operation ('|').
TH32CS_SNAPHEAPLIST
0x00000001
Includes all heaps of the process specified in th32ProcessID in the snapshot. To enumerate the heaps, see Heap32ListFirst.
TH32CS_SNAPMODULE
0x00000008
Includes all modules of the process specified in th32ProcessID in the snapshot. To enumerate the modules, see Module32First. If the function fails withERROR_BAD_LENGTH, retry the function until it succeeds.
64-bit Windows: Using this flag in a 32-bit process includes the 32-bit modules of the process specified in th32ProcessID, while using it in a 64-bit process includes the 64-bit modules. To include the 32-bit modules of the process specified in th32ProcessID from a 64-bit process, use the TH32CS_SNAPMODULE32 flag.
TH32CS_SNAPMODULE32
0x00000010
Includes all 32-bit modules of the process specified in th32ProcessID in the snapshot when called from a 64-bit process. This flag can be combined withTH32CS_SNAPMODULE or TH32CS_SNAPALL. If the function fails withERROR_BAD_LENGTH, retry the function until it succeeds.
TH32CS_SNAPPROCESS
0x00000002
Includes all processes in the system in the snapshot. To enumerate the processes, see Process32First.
TH32CS_SNAPTHREAD
0x00000004
Includes all threads in the system in the snapshot. To enumerate the threads, seeThread32First.
To identify the threads that belong to a specific process, compare its process identifier to the th32OwnerProcessID member of the THREADENTRY32structure when enumerating the threads.
th32ProcessID [in]
The process identifier of the process to be included in the snapshot. This parameter can be zero to indicate the current process. This parameter is used when the TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32, or TH32CS_SNAPALL value is specified. Otherwise, it is ignored and all processes are included in the snapshot.
If the specified process is the Idle process or one of the CSRSS processes, this function fails and the last error code is ERROR_ACCESS_DENIED because their access restrictions prevent user-level code from opening them.
If the specified process is a 64-bit process and the caller is a 32-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299).
Return value
If the function succeeds, it returns an open handle to the specified snapshot.
If the function fails, it returns INVALID_HANDLE_VALUE. To get extended error information, call GetLastError. Possible error codes include ERROR_BAD_LENGTH.
Remarks
The snapshot taken by this function is examined by the other tool help functions to provide their results. Access to the snapshot is read only. The snapshot handle acts as an object handle and is subject to the same rules regarding which processes and threads it is valid in.
To enumerate the heap or module states for all processes, specify TH32CS_SNAPALL and set th32ProcessID to zero. Then, for each additional process in the snapshot, call CreateToolhelp32Snapshot again, specifying its process identifier and the TH32CS_SNAPHEAPLIST or TH32_SNAPMODULE value.
When taking snapshots that include heaps and modules for a process other than the current process, theCreateToolhelp32Snapshot function can fail or return incorrect information for a variety of reasons. For example, if the loader data table in the target process is corrupted or not initialized, or if the module list changes during the function call as a result of DLLs being loaded or unloaded, the function might fail with ERROR_BAD_LENGTH or other error code. Ensure that the target process was not started in a suspended state, and try calling the function again. If the function fails with ERROR_BAD_LENGTH when called with TH32CS_SNAPMODULE or TH32CS_SNAPMODULE32, call the function again until it succeeds.
To destroy the snapshot, use the CloseHandle function.
HANDLE WINAPI CreateToolhelp32Snapshot( // Создание объекта «снимок системы» [out]
DWORD dwFlags, // - флаги [in]
DWORD th32ProcessID // - идентификатор процесса [in]
);
BOOL WINAPI Process32First( // Получение информации о первом процессе в списке процессов
HANDLE hSnapshot, // хэндл снимка [in]
LPPROCESSENTRY32 lppe // указатель на структуру «информация о процессе» [in/out]
);
BOOL WINAPI Process32Next( // Получение информации о следующем процессе в списке процессов
HANDLE hSnapshot, // хэндл снимка [in]
LPPROCESSENTRY32 lppe // указатель на структуру «информация о процессе» [out]
);
BOOL WINAPI Thread32First( // Получение информации о первом потоке в списке потоков
HANDLE hSnapshot, // хэндл снимка [in]
LPTHREADENTRY32 lpte // указатель на структуру «информация о потоке» [in/out]
);
BOOL WINAPI Thread32Next( // Получение информации о следующем потоке в списке потоков
HANDLE hSnapshot, // хэндл снимка [in]
LPTHREADENTRY32 lpte // указатель на структуру «информация о потоке» [out]
);
Функция SetPriorityClass
Функция SetPriorityClass устанавливает класс приоритета для заданного процесса. Это значение вместе со значением приоритета каждого потока процесса обуславливает базовый уровень приоритета каждого потока.
Синтаксис
BOOL SetPriorityClass( HANDLE hProcess, // дескриптор процесса DWORD dwPriorityClass // значение класса приоритета ); |
Параметры
hProcess
[in] Дескриптор процесса.
Windows NT /2000/XP: дескриптор должен иметь право доступа PROCESS_SET_INFORMATION. Для получения дополнительной информации, см. Защита процесса и права доступа.
dwPriorityClass
[in] Класс приоритета для процесса. Этот параметр может быть одним из нижеследующих значений:
Приоритет |
Предназначение |
ABOVE_NORMAL_PRIORITY_CLASS |
Windows 2000 /XP: Процесс, который имеет приоритет выше NORMAL_PRIORITY_CLASS, но нижеHIGH_PRIORITY_CLASS. |
BELOW_NORMAL_PRIORITY_CLASS |
Windows 2000 /XP: Процесс, который имеет приоритет выше IDLE_PRIORITY_CLASS, но нижеNORMAL_PRIORITY_CLASS. |
HIGH_PRIORITY_CLASS |
Обозначает процесс, выполняющий критические по времени задачи, которые должны быть выполнены немедленно для того, чтобы запустить их правильно. Потоки процесса высокоприоритетного класса выгружают потоки процессов нормального класса или класса приоритета в бездействующей системе. Пример - Список задач Windows, который должен быстро отреагировать, когда вызывается пользователем, независимо от загрузки на операционной системе. Высокоприоритетный класс используйте крайне осторожно, потому что программа высокоприоритетного класса, ограниченная возможностями процессора, может использовать почти все циклы доступа к нему. |
IDLE_PRIORITY_CLASS |
Обозначает процесс, потоки которого запускаются только тогда, когда система неактивна и выгружается потоками любого процесса, запущенного с более высоким классом приоритета. Пример - программа-заставка (хранитель экрана). Класс приоритета в бездействующей системе наследуется дочерними процессами. |
NORMAL_PRIORITY_CLASS |
Процесс, который не нуждается в специальных мерах диспетчеризации. |
REALTIME_PRIORITY_CLASS |
Процесс, который имеет самый высокий возможный приоритет. Потоки этого процесса выгружают потоки всех других процессов, включая процессы операционной системы, выполняющие важные задачи. Например, процесс реального времени, который работает больше, чем очень краткий промежуток времени, может стать причиной того, что дисковые КЭШи не стану сбрасывать на диск или причиной того, что мышь будет не реагирующей. |
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получать дополнительные данные об ошибке, вызовите GetLastError.
Замечания
Каждый поток имеет базовый уровень приоритета, обуславливающийся значением приоритета потока и классом приоритета его процесса. Система использует базовый уровень приоритета всех выполняемых потоков, чтобы установить, который поток получает следующий квант процессорного времени. Функция SetThreadPriority дает возможность регулировки базового уровня приоритета потока относительно класса приоритета его процесса. Для получения дополнительной информации, см. Приоритеты в обслуживнии.
Функция SetThreadPriority
Функция SetThreadPriority устанавливает значение приоритета для заданного потока. Это значение, вместе с классом приоритета процесса потока, обуславливает базовый уровень приоритета потока.
Синтаксис
BOOL SetThreadPriority( HANDLE hThread, // дескриптор потока int nPriority // уровень приоритета потока ); |
Параметры
hThread
[in] Дескриптор потока, значение приоритета которого должно быть установлено.
Windows NT/2000/XP: Дескриптор должен иметь право доступа THREAD_SET_INFORMATION связанное с ним. Для получения дополнительной информации, см. статью Защита потока и права доступа.
nPriority
[in] Значение приоритета для потока. Этот параметр может быть одним из следующих значений:
Приоритет |
Предназначение |
THREAD_PRIORITY_ABOVE_NORMAL |
Приоритет на 1 пункт выше класса приоритета. |
THREAD_PRIORITY_BELOW_NORMAL |
Приоритет на 1 пункт ниже класса приоритета. |
THREAD_PRIORITY_HIGHEST |
Приоритет на 2 пункта выше класса приоритета. |
THREAD_PRIORITY_IDLE |
базовый приоритет 1 для процессов IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS или HIGH_PRIORITY_CLASS и уровень базового приоритета 16 для процессов REALTIME_PRIORITY_CLASS. |
THREAD_PRIORITY_LOWEST |
Приоритет на 2 пункта ниже класса приоритета. |
THREAD_PRIORITY_NORMAL |
Нормальный приоритет класса приоритета. |
THREAD_PRIORITY_TIME_CRITICAL |
базовый приоритета 15 для процессов IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS или HIGH_PRIORITY_CLASS и уровень базового приоритета 31 для процессов REALTIME_PRIORITY_CLASS. |
Windows 2000/XP: этот параметр может быть также -7, -6, -5, -4, -3, 3, 4, 5, или 6. Для получения дополнительной информации, см. Приоритеты обслуживания.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.
Замечания
Каждый поток имеет базовый уровень приоритета, определяемый значением приоритета потока и классом приоритета его процесса. Система использует базовый уровень приоритета всех исполняемых потоков, чтобы установить, который поток получает следующий квант процессорного времени. Потокам устанавливается очередность обслуживания циклическим способом в каждом уровне приоритета, и только тогда, когда нет никаких выполняемых потоков на более высоком уровне, происходит диспетчеризация потоков на более низком уровне.
Функция SetThreadPriority дает возможность установки базового уровня приоритета потока относительно класса приоритета его процесса. Например, устанавливая THREAD_PRIORITY_HIGHEST при вызовеSetThreadPriority для потока процесса IDLE_PRIORITY_CLASS базовый уровень приоритета потока устанавливается в значение 6. За таблицей, которая показывает, базовые уровни приоритета для каждой комбинации класса приоритета и значения приоритета потока, обратитесь к статье Приоритеты обслуживания.
Для процессов IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS и HIGH_PRIORITY_CLASS, система динамически повышает (форсирует) базовый уровень приоритета потока, когда происходят события, которые являются важными для потока. Процессы REALTIME_PRIORITY_CLASS не получают динамического форсирования.
Все потоки вначале запускаются как THREAD_PRIORITY_NORMAL. Используйте функции GetPriorityClass и SetPriorityClass, чтобы получать и устанавливать класс приоритета процесса. Используйте функциюGetThreadPriority, чтобы получить значение приоритета потока.
Используйте класс приоритета процесса, чтобы различать между прикладными программами те, которые являются критическими по времени исполнения и те, которые требуют нормальной или ниже нормальной очередности обслуживания. Используйте значения приоритета потока, чтобы различать относительные приоритеты задач процесса. Например, поток, который обрабатывает ввод данных для окна, может иметь более высокий уровень приоритета, чем поток, который выполняет интенсивные вычисления для ЦПУ.
При управлении приоритетами, будьте очень осторожными, чтобы гарантировать, что высокоприоритетный поток не поглотит все доступное процессорное время. Поток с базовым уровнем приоритета более чем 11 мешает нормальным операциям операционной системы. Использование REALTIME_PRIORITY_CLASS может стать причиной, что буферы системы ввода-вывода не станут сбрасывать на диск, зависание мыши, и так далее.
Функция TerminateThread
Функция TerminateThread завершает работу потока.
Синтаксис
BOOL TerminateThread( HANDLE hThread, // дескриптор потока DWORD dwExitCode // код завершения для потока ); |
Параметры
hThread
[in/out] Дескриптор потока, который завершает работу.
Windows NT/2000/XP: Дескриптор должен иметь право доступа THREAD_TERMINATE. Для получения дополнительной информации, см. статью Защита потока и права доступа.
dwExitCode
[in] Код завершения работы потока. Используйте функцию GetExitCodeThread, чтобы извлечь значение выхода потока.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.
Замечания
Функция TerminateThread - используется для того, чтобы заставить поток завершить работу. Когда это происходит, у целевого потока нет возможности, чтобы исполнить какой-либо код непривилегированного (пользовательского) режима, и его исходный стек не освобождается. Динамически подключаемые библиотеки (DLL), связанные с потоком не уведомляются о том, что поток завершает работу.
TerminateThread - опасная функция, которая должна быть использована только в наиболее критических случаях. Вы должны вызывать TerminateThread, только в том случае, если знаете точно, что целевой поток делает, и Вы управляете всем кодом, который целевой поток, возможно, мог бы выполнить во время завершения. Например, TerminateThread может привести к нижеследующим проблемам:
Если целевой поток владеет критической секцией программы, критическая секция не будет освобождена.
Если целевой поток выделяет память из "кучи ", блокировка "кучи " не будет освобождена.
Если целевой поток, когда он завершает работу, вызывает на выполнение некоторый код kernel32, состояние kernel32 для процесса потока может быть несовместимым.
Если целевой поток управляет, глобальным состоянием совместно используемых DLL, состояние DLL может быть разрушено, воздействиями других пользователей DLL.
Поток не может защитить себя против TerminateThread, не иначе как управляя доступом к своим дескрипторам. Дескриптор потока, возвращенный функциями CreateThread и CreateProcess, имеет доступTHREAD_TERMINATE, так что любая вызывающая программа, удерживающая один из этих дескрипторов может завершить работу вашего потока.
Состояние объекта потока становится сигнальным, освобождая любые другие потоки, которые ждали завершения работы потока. Состояние завершения потока изменяется от STILL_ACTIVE до значения параметраdwExitCode.
Завершение работы потока необязательно удаляет объект потока из системы. Объект потока удаляется тогда, когда закрывается последний дескриптор потока.
Функция TerminateProcess
Функция TerminateProcess завершает работу заданного процесса и всех его потоков.
Синтаксис
BOOL TerminateProcess( HANDLE hProcess, // дескриптор процесса UINT uExitCode // код выхода из процесса ); |
Параметры
hProcess
[in] Дескриптор процесса, который завершает работу.
Windows NT/2000/XP: дескриптор должен иметь право доступа PROCESS_TERMINATE. Для получения дополнительной информации, см. статью Защита процесса и права доступа.
uExitCode
[in] Код выхода, который использует процесс и потоки, чтобы завершить работу в результате этого вызова. Используйте функцию GetExitCodeProcess, чтобы извлечь значение выхода процесса. Используйте функциюGetExitCodeThread, чтобы извлечь значение выхода потока.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не ноль.
Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получать расширенные данные об ошибках, вызовите GetLastError.
Замечания
Функция TerminateProcess используется, чтобы безоговорочно заставить процесс выйти из работы. Используйте ее только в экстремальных обстоятельствах. Состояние глобальных данных, поддерживаемых библиотеками динамической связи (DLL) может быть поставлено под угрозу, если используется TerminateProcess, а не функция ExitProcess.
Функция TerminateProcess инициализирует завершение работы процесса и немедленно возвращает значение. Это останавливает выполнение всех потоков в пределах процесса и запрашивает отмену обработки всех ждущих ввода – вывода данных. Завершающий исполнение кода процесс не может выйти из работы, пока не будет закончена обработка всех ждущих ввода - вывода данных или эти действия будут отменены.
Завершение процесса вызывает ниже перечисленное:
Все дескрипторы объектов, открытые процессом, закрываются.
Все потоки в процессе завершают исполнение своего кода.
Состояние объекта процесса становится сигнальным, удовлетворяя требования любых потоков, которые ждали когда закончиться процесс. Объект процесса удаляется, когда закрывается последний дескриптор процесса.
Состояние всех потоков процесса становится сигнальным, удовлетворяя требования любых потоков, которые ждали завершения работы потоков.
Состояние завершения процесса изменяется от STILL_ACTIVE до значения выхода процесса.
Завершение процесса не заставляет дочерние процессы завершать работу.
Динамически подключаемые библиотеки (DLL), связанные с процессом не уведомляются, что процесс заканчивает работу.
Завершение процесса не создает уведомления для фильтр (hook) - процедуры WH_CBT.
Функция CreateThread
Функция CreateThread создает поток, который выполняется в пределах виртуального адресного пространства вызывающего процесса.
Чтобы создавать поток, который запускается в виртуальном адресном пространстве другого процесса, используется функция CreateRemoteThread.
Синтаксис
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // дескриптор защиты SIZE_T dwStackSize, // начальный размер стека LPTHREAD_START_ROUTINE lpStartAddress, // функция потока LPVOID lpParameter, // параметр потока DWORD dwCreationFlags, // опции создания LPDWORD lpThreadId // идентификатор потока ); |
Параметры
lpThreadAttributes
[in] Указатель на структуру SECURITY_ATTRIBUTES, которая обуславливает, может ли возвращенный дескриптор быть унаследован дочерними процессами. Если lpThreadAttributes является значением ПУСТО (NULL), дескриптор не может быть унаследован.
Windows NT/2000/XP: член структуры lpSecurityDescriptor определяет дескриптор безопасности для нового потока. Если lpThreadAttributes имеет значение ПУСТО (NULL), поток получает заданный по умолчанию дескриптор защиты. Списки контроля доступа (ACL) в заданном по умолчанию дескрипторе безопасности для потока поступают из первичного маркера или маркера заимствования прав создателя.
dwStackSize
[in] Начальный размер стека, в байтах. Система округляет это значение до самой близкой страницы памяти. Если это значение нулевое, новый поток использует по умолчанию размер стека исполняемой программы. Дополнительную информацию см. в статье Размер стека потока
Обратите внимание! на то, что, в случае необходимости, размер стека растет. |
lpStartAddress
[in] Указатель на определяемую программой функцию типа LPTHREAD_START_ROUTINE, код которой исполняется потоком и обозначает начальный адрес потока. Для получения дополнительной информации о функции потока, см. ThreadProc.
lpParameter
[in] Указатель на переменную, которая передается в поток.
dwCreationFlags
[in] Флажки, которые управляют созданием потока. Если установлен флажок CREATE_SUSPENDED, создается поток в состоянии ожидания и не запускается до тех пор, пока не будет вызвана функция ResumeThread. Если это значение нулевое, поток запускается немедленно после создания. В это время, никакие другие значения не поддерживаются.
Windows XP: Если установлен флажок STACK_SIZE_PARAM_IS_A_RESERVATION, параметр dwStackSize задает начальный резервный размер стека. Иначе, dwStackSize устанавливает фиксированный размер.
lpThreadId
[out] Указатель на переменную, которая принимает идентификатор потока.
Windows NT /2000/XP: Если этот параметр имеет значение ПУСТО (NULL), идентификатор потока не возвращается.
Windows 95/98/Me: Этот параметр не может быть значением ПУСТО (NULL).
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - дескриптор нового потока.
Если функция завершается с ошибкой, величина возвращаемого значения - ПУСТО (NULL). Чтобы получать дополнительные данные об ошибках, вызовите GetLastError.
Обратите внимание!, что функция CreateThread может завершиться успешно, даже если lpStartAddress указывает на данные, код или не понятно куда. Если ее начальный адрес ошибочен, когда поток запускается, происходит исключительная ситуация и поток заканчивает работу. Завершение работы потока в результате недопустимого начального адреса обрабатывается как выход из-за ошибки для процесса потока. Это поведение похоже на асинхронный характер CreateProcess, где процесс создается, даже если он адресуется к ошибочным или отсутствующим библиотекам динамической связи (DLL). |
Windows 95/98/Me: функция CreateThread завершается успешно, только тогда, когда она вызвана в контексте 32-разрядной программы. 32-разрядная DLL не может создать дополнительный поток, когда эта DLLвызывается 16-разрядной программой.
Замечания
Число потоков, которые процесс может создать, ограничено доступной виртуальной памятью. По умолчанию, каждый поток имеет один мегабайт пространства стека. Поэтому, Вы можете создавать самое большое 2028 потоков. Если Вы преобразовываете заданный по умолчанию размер стека, Вы можете создавать большее количество потоков. Однако ваше приложение будет иметь лучшую эффективность, если Вы создаете один поток на процессор и выстраиваете очередь запросов, которые приложение сохраняют информацию контекста. Поток должен обрабатывать все запросы в очереди перед обработкой запросов следующей очереди.
Новый дескриптор потока создается с правами доступа THREAD_ALL_ACCESS. Если дескриптор безопасности не предоставляется, этот дескриптор может быть использован в любой функции, которая требует дескриптора объекта потока. Когда дескриптор безопасности предоставлен, проверка доступа выполняется для всех последующих использованиях дескриптора прежде, чем этот доступ предоставляется. Если проверка доступа не запрещает доступ, запрашивающий процесс не может использовать дескриптор, чтобы получить доступ к потоку. Если поток исполняет роль клиента, то он вызывает CreateThread с дескриптором безопасности имеющим значение ПУСТО (NULL), созданный объект потока имеет заданный по умолчанию дескриптор безопасности, который позволяет доступ только владельцу маркера заимствования прав или членамTokenDefaultDacl. Для получения дополнительной информации, см. статью Защита потока и права доступа.
Выполнение потока начинается в функции, указанной параметром lpStartAddress . Если эта функция возвращает значение, величина возвращаемого значения ДВОЙНОЕ СЛОВО (DWORD) используется, чтобы завершить работу потока неявным вызовом функции ExitThread. Чтобы получить величину возвращаемого значения потока, используйте функцию GetExitCodeThread.
Поток создается с приоритетом потока THREAD_PRIORITY_NORMAL. Используйте функции GetThreadPriority и SetThreadPriority, чтобы получать и установить приоритетное значение потока.
Когда поток заканчивает работу, объект потока приобретает сигнального состояния, удовлетворяя любые потоки, которые ждали объект.
Объект потока остается в системе, до тех пор, пока не поток закончит работу, и все дескрипторы к нему не будут закрыты через вызов CloseHandle.
Функции ExitProcess, ExitThread, CreateThread, CreateRemoteThread и процесс, который запускается (как результат вызова CreateProcess), в пределах процесса переводятся между собой в последовательный режим. Одновременно в адресном пространстве может происходить только одно из этих событий. Это означает нижеследующие ограничения выполнения:
|
Поток, который использует функции из библиотек этапа исполнения C, для управления потоком должен использовать C - функции этапа исполнения beginthread и endthread, а не CreateThread и ExitThread. Когда вызывается ExitThread, происходит утечка ресурсов в маленькой памяти, что приводит к сбою в программе.
Функция ResumeThread
Функция ResumeThread уменьшает счет времени приостановки работы потока. Когда счет времени приостановки работы уменьшается до нуля, выполнение потока продолжается.
Синтаксис
DWORD ResumeThread( HANDLE hThread // дескриптор потока ); |
Параметры
hThread
[in] Дескриптор для потока, который будет перезагружен.
Windows NT/2000/XP: дескриптор должен иметь право доступа THREAD_SUSPEND_RESUME. Для получения дополнительной информации, см. статью Защита потока и права доступа
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - предшествующий счет времени приостановки работы потока.
Если функция завершается с ошибкой, величина возвращаемого значения равна - (минус) 1. Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.
Замечания
Функция ResumeThread проверяет счет времени приостановки работы подчиненного потока. Если счет времени приостановки работы равен 0, поток в настоящее время не приостановлен. Иначе, счет времени приостановки работы подчиненного потока уменьшается. Если итоговое значение - 0, то выполнение подчиненного потока продолжается.
Если величина возвращаемого значения - ноль, заданный поток не был приостановлен. Если величина возвращаемого значения равна 1, заданный поток приостановлен, но был перезагружен. Если величина возвращаемого значения больше чем 1, заданный поток все еще приостанавливается.
Обратите внимание! на то, что при сообщении о событиях отладки, все потоки в пределах сообщающего процесса замораживаются. Предполагается, что отладчики используют функции SuspendThread иResumeThread, чтобы ограничить установку потоков, которые могут выполняться в пределах процесса. Приостановка работы всех потоков в процессе предполагает, что один дает отчет о событии отладки, что возможно в " пошаговом" режиме отладки отдельного потока. Другие потоки не освобождаются от продолжения операций, если они приостановлены. |
Функция SuspendThread
Функция SuspendThread приостанавливает работу заданного потока.
Синтаксис
DWORD SuspendThread( HANDLE hThread // дескриптор потока ); |
Параметры
hThread
[in] Дескриптор потока, работа которого приостанавливается.
Windows NT/2000/XP: Дескриптор должен иметь право доступа THREAD_SUSPEND_RESUME. Для получения дополнительной информации, см. статью Защита потока и права доступа.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - счет времени предыдущей приостановки работы потока; иначе, оно равно - (минус) 1. Чтобы получить дополнительные данные об ошибках, используйте функцию GetLastError.
Замечания
Если функция завершается успешно, выполнение заданного потока приостанавливается, а счет времени приостановки работы потока увеличивается. Приостановка потока заставляет его прекратить выполнять код (приложение) в непривилегированном (пользовательском) режиме.
Эта функция, прежде всего, разработана для использования отладчиками. Она не предназначена использоваться для синхронизации потока. Вызов функции SuspendThread потоком, который имеет объект синхронизации, типа мьютекса (флажка блокировки) или критической секции, может привести к тупиковой ситуации, если вызывающий поток пробует получить объект синхронизации, принадлежащий приостановленному потоку. Чтобы избежать этой ситуации, поток в пределах прикладной программы, которое не является отладчиком, должен подать сигнал другому потоку, что приостановил себя. Целевой поток должен быть разработан, чтобы наблюдать за этим сигналом и соответственно реагировать.
Каждый поток имеет счет времени приостановки работы (с максимальным значением MAXIMUM_SUSPEND_COUNT). Если счет времени приостановки больше чем нуль, поток приостанавливается; иначе, поток не приостанавливается и имеет право на исполнение кода. Вызов функции SuspendThread заставляет увеличить счет времени приостановки намеченного потока. Попытка увеличить его за пределы максимального счета времени приостановки вызывает ошибку без увеличения счета.
Функция ResumeThread уменьшает счет времени приостановки работы замороженного потока.
double omp_get_wtime( );
Возвращаемое значение
Возвращает значение времени в секундах истекл от какого-либо произвольного, но последовательного точки.
