2017-10-08 1 views
-7

winapi의 CreateThread() 함수를 사용하여 스레드를 만들려고하는데 작동하지 않습니다. 모든CreateThread()가 작동하지 않습니다.

void Inc::init() { 
    DWORD id; 
    HANDLE hnd = CreateThread(NULL,0,asd,this,0,&id); 
} 
DWORD Inc::asd(LPVOID lparam) { 
    Inc* g = (Inc*)lparam; 
    printf("asd"); 
} 

ASD에서 어떤 오류가() 당신은 디버깅 우리가 도울 수있는 최소한의 컴파일 코드를 게시되지 않은 모든

+4

확실하지 않습니까? 인쇄하는 문자열이 플러시되지 않으므로 버퍼링 문제 일 수 있습니다. 인쇄 한 문자열에 후행 줄 바꾸기를 추가하십시오. 그리고 디버거를 사용하여 스레드 함수에 * 중단 점 *을 넣어 실행 된 것을 확인하는 방법을 배웁니다. 아마도'CreateThread'가 반환하는 것을 확인해야 할 것입니다. –

+1

디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. [MCVE]와 [ask]를 만드는 방법을 읽어보십시오. – tambre

+0

@Someprogrammerdude, Windows는 라인 버퍼링을 사용하지 않으므로 개행을 추가해도 아무런 차이가 없습니다. (아마도 제 3 자 C 런타임을 사용하고있을 지 모르지만 그럴 가능성은 희박합니다.) –

답변

3

에서 실행되지되지 않기 때문에, 모든 것을 내가 말할려고 해요 CreateThread는 C 함수이며,

  • 확인을 클래스 메소드에 대해 아무것도 모르는, static을 선언

    1. 확실 asd합니다 다른 질문을 기반으로 추측 나는이 ​​주제에 본 적이 10이 __stdcall으로 선언되면 잘못된 호출 규칙을 사용하면 이상하고 예상치 못한 결과가 발생할 수 있습니다.
    2. 스레드가 끝날 때까지 this이 파괴되지 않도록하십시오.
    3. 프로그램이 을 완료하지 않고 전에 스레드가 실행을 완료했는지 확인하십시오. 스레드가 변경 사항을 인쇄하기 전에 프로그램이 종료되면 출력 할 것을 기대하지 않습니까? 스레드 핸들을 어딘가에 저장하고 WaitForSingleObject을 사용하여 스레드 작업이 완료되었는지 확인하십시오.
    4. asdDWORD 값을 반환하지 않습니다. 일부 반환 코드를 반환해야합니다.

    일반적인 사항 : std::thread :

    1. 는 C-캐스트를 사용하지 않는이, static_cast
    2. 표준 라이브러리는 이미 스레드 개체가 같은 캐스팅 C++를 사용합니다. 그것을 대신 사용하는 것을 고려하십시오.
    3. 시스템 호출과 마찬가지로 이어야 시스템 호출 결과를 확인할 수 있습니다. 반환 된 핸들이 null 인 경우 마지막 오류 값을 GetLastError으로 확인해야합니다.
  • 관련 문제