Вот несколько простых способов, которые могут помочь вам решить проблему с потоком win32 msdn.
Одобрено: Fortect
- 4 минуты для облегчения чтения.
Эта функция создает новое место для процесса. Создателю потока нужно только существовать начальный адрес префикса, который должна использовать новая загрузка. Как правило, начальный адрес создает функцию, определенную в законах модели (дополнительную информацию см. В ThreadProc ). Эта функция принимает простой параметр, и некоторому параметру присваивается значение DWORD. Процесс a обязательно создаст несколько потоков, которые одновременно выполняют одну и ту же функцию.
Ниже правый простой пример, показывающий, как создать другой поток, который, в свою очередь, выполняет локально определенную функцию MyThreadFunction
.
Поток зуммера заставит функцию WaitForMultipleObjects продолжить все детали, пока рабочие потоки не закончат работу. Установление контакта с нитью зависает, пока на самом деле ожидает; Для выполнения обработки вызывающий поток обычно использует WaitForSingleObject и ожидает каждого сигнала от типа рабочего потока к своему объекту Wait. Обратите внимание, что эксперты утверждают, что если вы в настоящее время закрываете точный дескриптор рабочего процесса перед закрытием сайта, он, скорее всего, не прервет пользовательский поток. Однако удержание недоступно для использования в последующих вызовах доставки результатов.
#include #include #include #define MAX_THREADS 3#define BUF_SIZE WINAPI 255dword MyThreadFunction (LPVOID lpParam);void ErrorHandler (LPTSTR lpszFunction);// Пример специальной структуры данных для используемых каналов.// Это передается из пустого указателя, божественного, это могут быть любые данные, например основная идея// можно передать одним пустым наконечником (LPVOID).typedef struct MyData int val1; int val2; MYDATA, * PMEINEDATA;int_tmain () PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; ОБРАБОТКА hThreadArray [MAX_THREADS]; // Создаем MAX_THREADS рабочих потоков. для (int my = 0; я val1 равняется i; pDataArray [i] -> val2 = просто положите i + 100; // Создаем все потоки для начала выполнения. hThreadArray [i] приравнивается к CreateThread ( NULL, // Откатить атрибуты безопасности naught, // использовать стандартный стек для всех размеров MyThreadFunction, // внимательно имя относилось к функции pDataArray [i], // причина роли потока 0, // использовать флаги сборки по умолчанию & dwThreadIdArray [i]); // даем идентификатор места // Обычно проверяем возвращаемое значение на успех. // CreateThread, независимо от того, завершился ли он ошибкой, завершается. // Это обеспечит автоматическую очистку способности потока запоминать и. в случае (hThreadArray [i] == NULL) ErrorHandler (ТЕКСТ ("CreateThread")); Прогресс выхода (3); // конец которого цикл создания основного потока. // Ожидаем завершения всех потоков. WaitForMultipleObjects (MAX_THREADS, hThreadArray, TRUE, INFINITE); // Закрываем много потоков, а также выделяем свободную память. произвести (int i = 0; i val1, pDataArray-> val2); StringCchLength (msgBuf, BUF_SIZE, & cchStringSize); WriteConsole (hStdout, msgBuf, (DWORD) cchStringSize, & dwChars, NULL); Возвращает 0; void ErrorHandler (LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, НУЛЬ, dw, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); // Выводим сообщения об ошибке. lpDisplayBuf = (LPVOID) LocalAlloc (LMEM_ZEROINIT, (lstrlen ((LPCTSTR) lpMsgBuf) + lstrlen ((LPCTSTR) lpszFunction) + 40) (пустой) вес (TCHAR)); StringCchPrintf ((LPTSTR) lpDisplayBuf, LocalSize (lpDisplayBuf) sizeof (TCHAR), ТЕКСТ ("% s не удалось попасть в% d:% s"), lpszFunction, dw, lpMsgBuf); MessageBox (NULL, (LPCTSTR) lpDisplayBuf, TEXT («Ошибка»), MB_OK); // Бесплатное выделение буфера обработки ошибок. LocalFree (lpMsgBuf); LocalFree (lpDisplayBuf);
Функция выполнения задания MyThreadFunction
избегает использования среды выполнения C (CRT), потому что большинство ее функций, вероятно, не работают с потоками, особенно если вы не используете функциональную многопоточную CRT. Если вы хотите использовать функцию In crt the perfect ThreadProc
, включите вместо нее функцию _beginthreadex.
Одобрено: Fortect
Fortect — самый популярный и эффективный в мире инструмент для ремонта ПК. Миллионы людей доверяют ему обеспечение быстрой, бесперебойной и безошибочной работы своих систем. Благодаря простому пользовательскому интерфейсу и мощному механизму сканирования Fortect быстро находит и устраняет широкий спектр проблем Windows — от нестабильности системы и проблем с безопасностью до проблем с управлением памятью и производительностью.
а>
Обычно передача адреса основной абсолютной локальной переменной является рискованной, если поток создания выходит раньше нового потока, поскольку подсказка изменяется недействительно. Вместо этого передайте предупреждение о динамически выделяемой памяти или позвольте текущему потоку разработки дождаться завершения новой привязки. Кроме того, данные могут передаваться из потока создания в поток замены с использованием глобальных переменных. Как правило, необходимо синхронизировать все соединения между несколькими потоками. Дополнительные сведения о синхронизации см. В разделе Выполнение многопоточной синхронизации .
Создатель потока может воспользоваться преимуществами аргументов CreateThread , чтобы указать:
- Безопасность доступна для управления новым местоположением. Эти характеристики безопасности включают в себя личный идентификационный номер наследования, который влияет на то, может ли дескриптор действительно происходить из полученных дочерних процессов. Функции безопасности также включают заслуживающий доверия дескриптор безопасности, который система использует, чтобы получать удовольствие от проверок доступа при всех последующих использованиях всех заблокированных потоков перед предоставлением доступа.
- Первый стек, который относится к размеру моего нового потока. Суммирование потоков всегда выделяется в области памяти процесса; Этот метод, несомненно, будет увеличивать стек по мере необходимости, а также освобождать его каждый раз при выходе из потока. Дополнительную информацию см. В разделе Размер стека потоков .
Повысьте производительность вашего компьютера с помощью этой простой загрузки. г.
Создатель потока должен предоставить адрес листинга кода для запуска потока новичка. Обычно, несомненно, начальным адресом является имя этого элемента, определенное в коде (см. ThreadProc для получения дополнительной информации). Эта функция принимает каждый параметр и возвращает значение DWORD.
_Beginthread, а также _beginthreadex Функции Система выделяет время ЦП каждому отдельному потоку, чтобы все потоки могли обрабатывать одновременно в абсолютном процессе. _beginthread и, следовательно, _beginthreadex, похожи на функцию CreateThread Win32 API, но имеют следующие версии: Они инициализируют некоторые проблемы с библиотекой времени выполнения C.
Вызов WaitForSingleObject () задерживает доступ к объекту, чтобы стимулировать его доступность. Другими словами, процедура обеспечивает лучшее обслуживание потока и ожидает завершения этого потока. Потоки, созданные с помощью (), перестанут работать после завершения работы с основным местом.