2013-02-22 3 views
4

C++ 11 스레드를 시험해보고 있습니다. 비동기 스레드에서 일부 코드를 실행하고 싶습니다. 코드가 완료되면 주 스레드에서 다른 코드를 실행하고 싶습니다. 하지만 완료되었을 때만!C++ 11 스레드, 메인 스레드에서 실행

비동기를 실행하고 싶은 것들이 OpenGL을로드하고 있기 때문에 스레드를 수행 할 때 OpenGL 컨텍스트와 약간 까다 롭습니다. 동일한 컨텍스트를 실행하지 않는 것이 좋습니다. 다른 스레드에서.

그러나 저는 collada 파일을로드하는 로더 스레드를 만들고 싶습니다. 시간이 많이 걸리는 여기 파일은 실제로 파일을 구문 분석하고 데이터를 설정하고 (기술적으로) 별도의 스레드에서 수행 할 수 있습니다. 그런 다음 주 스레드에서 OpenGL 특정 작업을 수행하십시오. (이것은 처음 생각이었고 잘못된 방향으로 가고있을 수도 있습니다.)

그래서 저는 콜라주 파일을로드하고 데이터를 채우기 위해 하나의 스레드 비동기를 분리 할 수 ​​있다면 일단 끝나면 버퍼를 바인드하고 셰이더를 설정하는 메인 스레드에서 호출합니다. 나는

그래서 내가하고 싶은 단계를 줄하려고합니다 .. 스레드없이 그것을 할 수 있지만, GL은 현실에서 도피하지 않고 백그라운드에서 새로운 데이터를로드 할 수 꽤 부드러운 것 :

  1. 메인 스레드는 새로운 메쉬가 그 안에
  2. 는 한편 메인 스레드가가는 COLLADA 데이터를 비동기 스레드로드를 생성하여 초기화
  3. 메쉬를로드 할 수 있도록
  4. 누군가가 묻습니다 ... 그것은 무엇을하고 주위에 간다 그 일을하는 것
  5. collada 로딩이 완료되면 비동기 스레드가 주 스레드에게 추가 로딩을 수행 할 것을 알립니다 (즉, 설치 버퍼 등) 메인 스레드에서.
  6. 설정까지 완료하고 메시는 내가 모든 동기 노력하고 내가 원하는 것은 분리 된 비동기 스레드 완료되면 어떤 일을 할 수있는 방법이 할 렌더 큐

에 자신을 추가합니다.

내 생각에 대한 모든 아이디어 또는 건설적인 비판 : P는 따뜻한 환영으로 인사드립니다! 나는 그것을 틀린 방식으로 생각하고 있을지도 모르지만, 나는 관찰자 패턴과 같은 것을하려고 생각하고 있었지만 그것을 가장 좋은 방법으로 다루는 방법을 정말로 모른다. OpenGL에 대한 내용을 스레딩하는 데는 아무 문제가 없습니다. 그러나 문제를 묻는 것처럼 보입니다.

답변

6

std::async() 기능을 올바르게 사용했다고 생각하면 std::launch::async 정책으로 시작하여 작동을 확인하십시오. 정말 다른 스레드에서 시작, 당신이 원하는 바로 수행합니다

// Your function to be executed asynchronously 
bool load_meshes(); 

// You can provide additional arguments if load_meshes accepts arguments 
auto f = std::async(std::launch::async, load_meshes); 

// Here, the main thread can just do what it has to do... 

// ...and when it's finished, it synchronizes with the operation 
// and retrieve its result (if any) 

bool res = f.get(); // res will hold the return value of load_meshes, 
        // or this will throw an exception if one was 
        // thrown inside load_meshes() 

if (res) 
{ 
    // ... and then it will go on doing the remaining stuff on the main thread 
} 

한 까다로운 것은 여기 알아야 할, 당신은 항상 (유형 std::future<T>의) 일부 변수에 std::async()의 반환 값을 할당해야한다는 것입니다 Tload_meshes()에 의해 반환되는 형식입니다. 이렇게하지 않으면 주 스레드가 load_meshes()이 끝날 때까지 대기하게됩니다 (따라서 함수가 주 스레드에서 호출 된 것과 같습니다).

+0

유망 해 보입니다! 나는 그것을 시도 할 것이지만, 내가 찾고있는 것과 똑같이 보인다. – qrikko

+2

@qrikko : 죄송합니다. 실행 정책을'std :: async()'의 첫 번째 인수로 지정하는 것을 잊었습니다. 편집 됨.이 인수가 없으면 구현은 새 스레드에서 시작할지 여부를 자유롭게 결정할 수 있습니다. –

+0

나는 그걸 가지고 놀았고, 당신이 설명하는 것처럼 작동했다.'f.get();이 실제로 멈추지 않았기 때문에 내가 생각한 것은 "준비가되었을 때 메인 스레드에서의 호출"이었다. 주 스레드가 완료 될 때까지 나는 비동기 기능이 완료되었을 때를 추적 할 필요가있다. 그러나 나는 당신의 대답이 정말로 제가 이해할 때 빠진 부분들을 파악하는데 도움이되었다고 생각합니다. – qrikko

관련 문제