2017-09-07 3 views
-1

문제 : ExecuteQueue 함수가 호출되면 Queue에 이미 두 개의 기존 패킷이 있으며 올바르게 호출됩니다 (콘솔에 인쇄 됨). 그러나 ExecuteQueue 함수가 다른 스레드에서 반복 되더라도 주 스레드는 차단됩니다 (QueuePacket에 도달하지 않습니다).C++ 스레드 블록 주 스레드

이미 stackoverflow를 탐색했으며 대부분의 문제점은 .join과 관련되었지만이 중 하나는 아마도 아닙니다 (.join을 제거해도 차이가 없음).

하여 Main.cpp

int main() { 
    // Start Client 
    boost::thread tClient(&Networking::Client::Initialize, Networking::Client()); // Still in Main-Thread???!?!? 
    Networking::Client::QueuePacket(Networking::Packet::Types::Disconnect); 

    // Start Modules 
    tClient.join(); 
    return 0; 
} 

Client.cpp (만 필요한 기능)

static bool QueuePacket(Packet p) { // Pushes existing Packet 
     return Globals::Queue.push(p); 
    } 

    void ExecuteQueue() { 
     while (Client::Active && Globals::NetworkConnectivity) { 
      if (Globals::Queue.empty()) { Sleep(500); continue; } 

      Packet p(Packet::Types::Invalid); 
      if (!Globals::Queue.pop(p)) continue; // Copies Packet into p on Success 
      if (p.Type == Packet::Types::Disconnect) { Client::Active = false; } // Disconnects Queue 
      if (p.Type == Packet::Types::Invalid) { } // Find some error handling here 

      ExecutePacket(p); 
     } 
    } 
+1

그리고 뭐가 문제입니까? – tambre

+0

@tambre 나는 교육적인 추측을하고 어떻게하면 메인 쓰레드를 막지 못하게 할 수있을 것이라고 말 할까? – Swagov3rflow

+1

나는 그것에 대한 충분한 정보가 있다고 생각하지 않는다. – drescherjm

답변

0
Networking::Client* ClientPtr = new Networking::Client(); 
    boost::thread tClient(&Networking::Client::Initialize, ClientPtr); 

이 작동합니다.