2013-01-06 2 views
0

저는 몇 년 동안 코딩을 많이하지 않았기 때문에 저는 C++에서 실제로 가지고있는 아이디어를 얻기 위해 정말로 기본적인 스레드 관리자를 만들고 싶었습니다. 이 오류가 발생하는 문제가 발생했습니다 :C++에서 기본 ThreadManager를 만들려고 할 때 오류가 발생했습니다.

ThreadManager.cpp:49:37: error: cannot convert 'ThreadManager::updateLoop' from type 'DWORD (ThreadManager::)(LPVOID) {aka long unsigned int (ThreadManager::)(void*)}' to type 'LPTHREAD_START_ROUTINE {aka long unsigned int (attribute((stdcall)) )(void)}'

그러나 수정 방법을 모르겠습니다. 여기에 제 코드가 있습니다. 포맷으로 여기에 붙여 넣을 방법을 알아낼 수 없었습니다. 내가 각 라인에 4 개 공간을 필요로하지만 시간이 걸릴 것처럼 보였다 말했다, 그래서 나는 페이스트 빈에 넣어 : 내가 말했듯이 http://pastebin.com/7xETj5BK

:

ThreadManager.cpp : http://pastebin.com/2bL3mTqv

ThreadManager.h , 나는 오랫동안 많은 것을 프로그래밍하지 못했고, 내가 기억하는 것으로 돌아 가려고 노력하고있다. 그래서 어떤 도움도 인정 될 것이다.

+0

또한 코드 수정을위한 제안 사항이 있으면 알려 주시기 바랍니다. 나는 그것이 좋은 OOP가 아니라는 것을 알고 있으며, 재사용 가능성은 거의 없다. 그러나 이것은 첫 번째 초안이며 내가 처음 작성한 첫 번째 프로그램이다. –

+2

우선,'TerminateThread'를 사용하지 마십시오. 둘째로, C++ 11을 사용할 수 있다면,'std :: thread'를 사용하거나'boost :: thread'를 사용하는 것을 금지하십시오. 그것들은'Win32' API를 직접 다루는 것보다 훨씬 쉬운 특정 인터페이스를 제공합니다. – Chad

+1

스레드 함수는 멤버 함수가 될 수 없습니다. 적어도이 방법은 아닙니다. 일반 함수 (메소드가 아님) 또는 클래스의 정적 메소드를 사용해야합니다. –

답변

0

의견에 기본이 나와 있지만 여기에 철자가 나와 있습니다. 호출에 정상 기능이 필요할 때 클래스에 메서드를 전달할 수 없습니다. 당신이하고 싶은 일을하기 위해 내가 할 거라고 다음 : 이제

// New Function 
void threadMain(void* classPointer) 
{ 
    ThreadManager* realClass = (ThreadManager*)classPointer; 
    realClass->updateLoop(); 
} 

ThreadManager::ThreadManager(int max) 
{ 
    // Assign maxThreads to max value 
    maxThreads = max; 

    // Start updateThread, and let it run updateLoop() until terminated 
    updateThread = CreateThread(
           NULL,  // default security attributes 
           0,   // use default stack size 
           threadMain, // thread function name 
           this,   // argument to thread function 
           0,   // use default creation flag 
           NULL);  // ignore thread identifier 

    // Check the return value for success 
    // If failed, exit process. 
    if (updateThread == NULL) { 
     ExitProcess(3); 
    }  
} 

내가 그렇게 아마 "이"포인터와 여분의 인수를 실제로 전달하는 표준 : : 튜플을 사용하여, 당신은 여분의 인수를 원하는지 필요.

이제 모든 것을 말하면서 다른 사람의 조언을 듣고 std::thread 등을 사용하십시오. 실제로 필요하지 않으면 win32 관련 호출이 아닙니다.

관련 문제