Составители:
Рубрика:
Дескриптор, полученный в результате выполнения функции GetCurrent-
Thread(), служит для тех же целей, что и дескриптор, возвращенный функцией
CreateThread(). Несмотря на то, что он может использоваться аналогично дру-
гим дескрипторам, на самом деле этот параметр является псевдодескриптором.
Псевдодескриптор – это специальная константа, которая всегда интерпретиру-
ется системой особым образом, подобно тому, как одиночная точка () в DOS
всегда указывает на текущий каталог, а параметр this в C++ определяет теку-
щий объект. Константа-псевдодескриптор, полученная в результате выполне-
ния функции GetCurrentThread(), указывает на текущий поток. В отличие от
настоящих дескрипторов, псевдодескриптор не может передаваться другим
потокам. Чтобы получить настоящий переносимый дескриптор потока, необ-
ходимо выполнить следующие действия:
HANDLE hThread;
hThread = DuplicateHandle(GetCurrentProcess(), // процесс-источник
GetCurrentThread(), // исходный дескриптор
GetCurrentProcess(), // целевой процесс
&hThread, // новый дублирующийся дескриптор
0, //привилегии доступа (подавляемые
// последним параметром)
FALSE, // дочерние объекты не унаследуют дескрип-
тор
DUPLICATE_SAME_ACCESS, // привилегии доступа
копируются у исходного дескриптора);…
Хотя функция CloseHandle() не влияет на псевдодескрипторы, дескрип-
тор, созданный с помощью функции DuplicateHandle(), является настоящим и в
конце концов должен быть закрыт. Применение псевдодескрипторов значи-
тельно ускоряет работу функции GetCurrentThread(), поскольку в этом случае
подразумевается, что поток имеет полный доступ сам к себе и функция воз-
вращает результат, не заботясь о мерах безопасности.
2.3.4. Прекращение выполнения потока
По аналогии с тем, как Windows-программа завершается по достижении
конца функции WinMain(), поток обычно прекращает свое существование при
достижении конца функции, в которой был начат. Когда он достигает конца
стартовой функции, система автоматически вызывает команду ExitThread(),
имеющую синтаксис:
VOID ExitThread(DWORD dwExitCode);…
Хотя операционная система вызывает функцию ExitThread() автоматиче-
ски, при необходимости досрочного завершения потока вы можете вызвать эту
функцию явным образом:
DWORD ThreadFunction(LPDWORD lpdwParam)
26
Дескриптор, полученный в результате выполнения функции GetCurrent- Thread(), служит для тех же целей, что и дескриптор, возвращенный функцией CreateThread(). Несмотря на то, что он может использоваться аналогично дру- гим дескрипторам, на самом деле этот параметр является псевдодескриптором. Псевдодескриптор – это специальная константа, которая всегда интерпретиру- ется системой особым образом, подобно тому, как одиночная точка () в DOS всегда указывает на текущий каталог, а параметр this в C++ определяет теку- щий объект. Константа-псевдодескриптор, полученная в результате выполне- ния функции GetCurrentThread(), указывает на текущий поток. В отличие от настоящих дескрипторов, псевдодескриптор не может передаваться другим потокам. Чтобы получить настоящий переносимый дескриптор потока, необ- ходимо выполнить следующие действия: HANDLE hThread; hThread = DuplicateHandle(GetCurrentProcess(), // процесс-источник GetCurrentThread(), // исходный дескриптор GetCurrentProcess(), // целевой процесс &hThread, // новый дублирующийся дескриптор 0, //привилегии доступа (подавляемые // последним параметром) FALSE, // дочерние объекты не унаследуют дескрип- тор DUPLICATE_SAME_ACCESS, // привилегии доступа копируются у исходного дескриптора);… Хотя функция CloseHandle() не влияет на псевдодескрипторы, дескрип- тор, созданный с помощью функции DuplicateHandle(), является настоящим и в конце концов должен быть закрыт. Применение псевдодескрипторов значи- тельно ускоряет работу функции GetCurrentThread(), поскольку в этом случае подразумевается, что поток имеет полный доступ сам к себе и функция воз- вращает результат, не заботясь о мерах безопасности. 2.3.4. Прекращение выполнения потока По аналогии с тем, как Windows-программа завершается по достижении конца функции WinMain(), поток обычно прекращает свое существование при достижении конца функции, в которой был начат. Когда он достигает конца стартовой функции, система автоматически вызывает команду ExitThread(), имеющую синтаксис: VOID ExitThread(DWORD dwExitCode);… Хотя операционная система вызывает функцию ExitThread() автоматиче- ски, при необходимости досрочного завершения потока вы можете вызвать эту функцию явным образом: DWORD ThreadFunction(LPDWORD lpdwParam) 26
Страницы
- « первая
- ‹ предыдущая
- …
- 24
- 25
- 26
- 27
- 28
- …
- следующая ›
- последняя »