Основы программирования в Win32API. Марапулец Ю.В. - 26 стр.

UptoLike

Составители: 

Дескриптор, полученный в результате выполнения функции 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