На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Creating Threads



The CreateThread function creates a new thread for a process. The creating thread must specify the starting address of the code that the new thread is to execute. Typically, the starting address is the name of a function defined in the program code. This function takes a single parameter and returns a DWORD value. A process can have multiple threads simultaneously executing the same function.

The following example demonstrates how to create a new thread that executes the locally defined function, ThreadFunc.

DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
char szMsg[80];

wsprintf( szMsg, "ThreadFunc: Parameter = %d\n", *lpParam );
MessageBox( NULL, szMsg, "Thread created.", MB_OK );

return 0;
}

VOID main( VOID )
{
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function

&dwThrdParam, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier

// Check the return value for success.

if (hThread == NULL)
ErrorExit( "CreateThread failed." );

CloseHandle( hThread );
}


For simplicity, this example passes a pointer to a DWORD value as an argument to the thread function. This could be a pointer to any type of data or structure, or it could be omitted altogether by passing a NULL pointer and deleting the references to the parameter in ThreadFunc.
It is risky to pass the address of a local variable if the creating thread exits before the new thread, because the pointer becomes invalid. Instead, either pass a pointer to dynamically allocated memory or make the creating thread wait for the new thread to terminate. Data can also be passed from the creating thread to the new thread using global variables. With global variables, it is usually necessary to synchronize access by multiple threads. For more information about synchronization, see Synchronizing Execution of Multiple Threads.

In processes where a thread might create multiple threads to execute the same code, it is inconvenient to use global variables. For example, a process that enables the user to open several files at the same time can create a new thread for each file, with each of the threads executing the same thread function. The creating thread can pass the unique information (such as the filename) required by each instance of the thread function as an argument. You cannot use a single global variable for this purpose, but you could use a dynamically allocated string buffer.

The creating thread can use the arguments to CreateThread to specify the following:

· The security attributes for the handle of the new thread. These security attributes include an inheritance flag that determines whether the handle can be inherited by child processes. The security attributes also include a security descriptor, which the system uses to perform access checks on all subsequent uses of the thread's handle before access is granted.
· The initial stack size of the new thread. The thread's stack is allocated automatically in the memory space of the process; the system increases the stack as needed and frees it when the thread terminates.

· A creation flag that enables you to create the thread in a suspended state. When suspended, the thread does not run until the ResumeThread function is called.



Windows NT: You can also create a thread by calling the CreateRemoteThread function. This function is used by debugger processes to create a thread that runs in the address space of the process being debugged.


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Создание Резьбы



Функция CreateThread создает новую резьбу для процесса. Создание резьбы должно определить стартовый адрес кода, что новая резьба должна выполнить. Обычно, стартовый адрес является именем функции определенной в программном коде. Эта функция берет единственный параметр и возвращает величину DWORD. Процесс может иметь многочисленную резьбу одновременно выполняющую ту же функцию.

Следующий пример демонстрирует как, чтобы создавать новую резьбу, которая выполняет локально определенную функцию, ThreadFunc.

DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
символ szMsg[80];

wsprintf( szMsg, "ThreadFunc: Параметр = %d\n", *lpParam );
MessageBox( НЕДЕЙСТВИТЕЛЬНЫЙ, szMsg, "Резьба создавалась.", MB_OK );

возврат 0;
}

НЕДЕЙСТВИТЕЛЬНАЯ основа( ПУСТОТА )
{
DWORD dwThreadId, dwThrdParam = 1;
ПРООПЕРИРУЙТЕ hThread;
hThread = CreateThread(
НЕДЕЙСТВИТЕЛЬНАЯ, // никакая безопасность не приписывает 0, // размер встроенной кипы использования ThreadFunc, // функции резьбы

&dwThrdParam, // АРГУМЕНТ, чтобы заправлять функции 0, // флаги встроенного создания использования &dwThreadId); // возврат идентификатор резьбы

// Проверьте обратную величину на наличие успеха.

если (hThread == НЕДЕЙСТВИТЕЛЬНЫЙ) ErrorExit( "CreateThread потерпевшее неудачу." );

CloseHandle( hThread );
}


Для простоты, этот пример передает указатель в величину DWORD как аргумент в функцию резьбы. Это могло быть указателем в любой тип данных или структуры, или могло бы быть опущено вместе передавая НЕДЕЙСТВИТЕЛЬНЫЙ указатель и удаляя ссылки на параметр в ThreadFunc.
Это рискованное, чтобы передавать адрес локальной переменной если создание резьбы выходит перед новой резьбой, поскольку указатель становится инвалидом. Взамен, или проход указатель на динамически распределившее память или делать созданием заправлять ожиданию новую резьбу, чтобы завершаться. Данные могут также пройдены от создания резьбы до новой резьбы, использовавшей глобальные переменные. С глобальными переменными, обычно необходимо должно синхронизировать доступ многочисленной резьбой. Более подробно о синхронизации, смотри Синхронизацию Выполнения Многочисленной Резьбы.

В процессах где резьба могла создать многочисленную резьбу, чтобы выполнять тот же код, она неудобная, чтобы использовать глобальные переменные. Например, процесс, который позволяет пользователя, чтобы открывать несколько файлов в то же самое время может создать новую резьбу для каждого файла, с каждой резьбой, выполняющей ту же функцию резьбы. Создание резьбы может передать уникальную информацию (как например, filename) требовавшееся каждым примером функции резьбы как аргумент. Вы не можете использовать единственную глобальную переменную с этой целью, но Вы могли бы использовать динамически размещенный буфер строки.

Создание резьбы может использовать аргументы на CreateThread, чтобы определять следующее:

Безопасность приписывается для ручки новой резьбы. Эти атрибуты безопасности включают флаг наследства, который определяет может ручка быть унаследована процессами ребенка. Атрибуты безопасности также включают дескриптор безопасности, который система использует, чтобы выполнять чеки доступа во всем последующем использовании ручки резьбы прежде, чем доступу предоставят.
Начальный размер стека новой резьбы. Стек резьбы распределяется автоматически в пространстве памяти процесса; система увеличивает стек как и требуется и освобождает это когда резьба завершается.

Флаг создания, который позволяет Вам, чтобы создавать резьбу в приостановленном состоянии. Когда приостановлено, резьба не делает работать пока функция ResumeThread не будет названа.



Windows NT: Вы можете также создать резьбу вызывая функцию CreateRemoteThread. Эта функция использована процессами отладчика, чтобы создавать резьбу, которая работает в пространстве адреса процесса, отлаживанного.


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz