Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
HANDLE CreateThread(
// Атрибуты безопасности (NULL)
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// Размер стека для потока (если 0, то используется умолчание
DWORD dwStackSize,
// Указатель на функцию потока
LPTHREAD_START_ROUTINE lpStartAddress,
// Аргументы, передаваемые потоку
LPVOID lpParameter,
// Флаги создания
DWORD dwCreationFlags,
// Получает ID потока
LPDWORD lpThreadId
);
Синтаксис данной команды довольно простой, но я хотел бы рассказать следующее: если вы передаёте нити аргументы, то их нужно прямо приводить к типу void *, а в самом потоке делать обратное преобразование. Данный способ позволяет передать потоку абсолютно любые параметры. Если вы не хотите, чтобы поток сразу же запускался, то укажите флаг CREATE_SUSPENDED, тогда нить создастся, но запускаться не будет. Функция CreateThread возвращает дескриптор потока или NULL при ошибке. Функция потока имеет вид DWORD WINAPI ThreadFunc(LPVOID data), где data – передаваемые параметры.
Для управления состоянием потоков используются функции SuspendThread и ResumeThread для соответственно приостанавливания и восстановления потоков. Функции принимают один аргумент – дескриптор потока и возвращают 1 в случае ошибки. Для убиения потока используется функция TerminateThread, она принимает два параметра: дескриптор потока и код ошибки. Если поток хочет сообщить вызывающему потоку код завершения, то он должен использовать функцию ExitThread(DWORD dwExit-Code), а вызывающий поток должен вызвать GetExitThread-Code(HANDLE hThread, LPDWORD lpdwExitCode), и поле lpdwExitCode заполняется кодом завершения потока.
Пример создания простого сервиса:
// Формат функции потока жёстко задан
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
char szMsg[80];
wsprintf( szMsg, "Поток: параметр = %d ", *lpParam );
MessageBox( NULL, szMsg, "Поток создан.", MB_OK );
return 0;
}
int main(void)