2017-09-07 4 views
-1

Problème: Lorsque la fonction ExecuteQueue Function est appelée, il y a déjà deux paquets existants dans la file d'attente et ils sont appelés correctement (imprimés sur la console). Mais même si la fonction ExecuteQueue est mise en boucle dans un autre Thread, le Thread Principal est bloqué (il ne parvient jamais à QueuePacket).C++ Blocs de threads Main-Thread

J'ai déjà parcouru stackoverflow et la plupart des problèmes étaient liés à .join mais celui-ci ne l'est probablement pas (supprimer le .join ne fait aucune différence).

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 (Seules les fonctions nécessaires)

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

Et quelle est la question? – tambre

+0

@tambre Je vais prendre une supposition éclairée et dire comment empêcher le blocage du thread principal ...? – Swagov3rflow

+1

Je ne pense pas qu'il y ait assez d'informations pour répondre à cette question. – drescherjm

Répondre

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

Cela fonctionne.