win32 msdn 스트림 문제를 수정하는 데 도움이 될 수 있는 몇 가지 쉬운 방법을 찾을 수 있습니다.
승인됨: Fortect
<울><리>
<리>
노동은 프로세스를 위한 새로운 위치를 만듭니다. 스트림 작성자는 새 제공자가 사용해야 하는 시작 접두사 주소만 있으면 됩니다. 일반적으로 시작 주소는 모델 코드에 정의된 함수 생성과 관련이 있습니다(자세한 내용은 ThreadProc 참조). 이 함수는 간단한 함수를 사용하며 일반적으로 매개변수에 DWORD 값이 할당됩니다. 프로세스는 동일한 기능을 동시에 수행하는 여러 스레드를 생성할 가능성이 높습니다.
다음은 지역적으로 설명된 MyThreadFunction
을 실행하는 향후 스레드를 생성하는 방법을 보여주는 간단한 예제입니다.
버저 스레드는 WaitForMultipleObjects 함수를 사용하여 작업자 스레드가 완료될 때까지 모든 종류의 작업을 계속합니다. 실제로 예상하는 동안 윙윙 거리는 스레드가 중단됩니다. 처리를 관리하기 위해 호출 스레드는 일반적으로 WaitForSingleObject 를 사용하고 특정 작업자 스레드에서 해당 Wait 개체까지의 각 신호를 기다립니다. 현재 일반적으로 사이트를 닫기 전에 워크플로 핸들을 닫는다면 사용자 흐름이 종료되지 않을 것이라고 전문가들이 주장하는 전문가의 주장에 유의하십시오. 그러나 거래는 후속 수행 호출에 사용할 수 없습니다.
<코드> #include#include #include #define MAX_THREADS 3개#define BUF_SIZE WINAPI 255dword MyThreadFunction(LPVOID lpParam);무효 ErrorHandler(LPTSTR lpszFunction);// 사용된 애비뉴에 대한 사용자 정의 데이터 구조에 관한 예.// 이것은 void 포인터에서 전달됩니다. 어리석게도, 그것은 일종의 아이디어와 같은 모든 데이터일 수 있습니다.// 하나의 null 힌트(LPVOID)로 전달할 수 있습니다.typedef 구조체 MyData 정수 val1; 정수 val2; 마이데이터, * PMEINEDATA;int_tmain() PMYDATA pDataArray [MAX_THREADS]; DWORD dwThreadIdArray [MAX_THREADS]; hThreadArray 처리 [MAX_THREADS]; // MAX_THREADS 작업자 스레드를 만듭니다. for (int 내 개인 = 0; i val1은 i와 같습니다. pDataArray [i] -> val2 = 동안 i + 100; // 실행을 시작할 모든 스레드를 생성합니다. hThreadArray [i]는 CreateThread( NULL, // 보안 속성 롤백 4, // 모든 크기에 대해 표준 스택 사용 MyThreadFunction, // 신중하게 함수 이름 pDataArray [i], // 스레드의 역할 이유 0, // 기본 빌드 플래그 사용 & dwThreadIdArray [i]); // 위치 ID 제공 // 일반적으로 성공 여부를 반환 값을 확인합니다. // CreateThread는 실패 여부에 관계없이 종료됩니다. // 이것은 아마도 스레드의 메모리를 자동으로 지우도록 할 것입니다. 케이스 주변(hThreadArray [i] == NULL) 오류 핸들러(텍스트("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을 반환합니다. 무효 ErrorHandler(LPTSTR lpszFunction) FORMAT_MESSAGE_IGNORE_INSERTS, 영, 드와이, 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), TEXT("% s이(가) % d:% s을(를) 적중할 수 없습니다"), lpszFunction, dw, lpMsgBuf); MessageBox(NULL, (LPCTSTR) lpDisplayBuf, TEXT("오류"), MB_OK); // 오류 감시 버퍼의 무료 할당. LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf);
MyThreadFunction
작업은 특히 다중 스레드 CRT를 사용하지 않는 경우 많은 기능이 스레드를 신뢰할 수 없기 때문에 C 런타임(CRT) 사용을 피합니다. In crt의 완벽한 ThreadProc
함수를 사용하려면 대신 _beginthreadex 함수를 구현하세요.
승인됨: Fortect
Fortect은 세계에서 가장 인기 있고 효과적인 PC 수리 도구입니다. 수백만 명의 사람들이 시스템을 빠르고 원활하며 오류 없이 실행하도록 신뢰합니다. 간단한 사용자 인터페이스와 강력한 검색 엔진을 갖춘 Fortect은 시스템 불안정 및 보안 문제부터 메모리 관리 및 성능 병목 현상에 이르기까지 광범위한 Windows 문제를 빠르게 찾아 수정합니다.
생성 쓰레드가 새 쓰레드보다 먼저 이익을 낸다면 믿을 수 없는 절대 지역 변수의 주소를 전달하는 것은 일반적으로 매우 위험합니다. 왜냐하면 힌트가 유효하지 않기 때문입니다. 대신, 동적으로 할당된 메모리 경고를 전달하거나 현재 개발 스레드가 새 바인딩과 관련하여 완료될 때까지 기다리도록 하십시오. 데이터는 전역 변수를 사용하여 생성 스트림에서 일부 대체 스트림으로 확실히 전달할 수 있습니다. 전체적으로 여러 스레드 간의 모든 연결을 동기화하는 것이 일반적으로 필요합니다. 동기화에 대한 자세한 내용은 다중 스레드 동기화 수행을 참조하십시오.
스레드 작성자는 CreateThread 인수를 사용하여 다음을 지정할 수 있습니다.
<울>
작성자 스레드는 초보자 스레드를 시작할 주소를 등록하기 위해 코드를 제공해야 합니다. 일반적으로 현재 시작 주소는 일반적으로 코드에 정의된 요소의 이름입니다(자세한 내용은 ThreadProc 참조). 이 함수는 각 매개변수를 취하고 DWORD 값을 반환합니다.
_Beginthread 추가 _beginthreadex 함수 시스템은 모든 스레드가 절대 프로세스에서 동시에 범위를 지정할 수 있도록 개별 스레드별로 CPU 시간을 할당합니다. _beginthread 및 _beginthreadex는 Win32 API의 CreateThread 함수와 유사하지만 다음 버전이 있습니다. C 런타임 라이브러리의 일부 문제를 초기화합니다.
WaitForSingleObject() 호출은 가용성을 표시하기 위해 개체에 도달하기를 기다리고 있습니다. 즉, 프로시저는 스레드에 더 나은 서비스를 제공하고 해당 스레드가 완료될 때까지 기다립니다. Chief()로 생성된 스레드는 메인 장소가 끝난 후 실행을 멈춥니다.