From 7fef2501a325fc9445c58d32ebc1cfad340b66e4 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 17 Jun 2013 07:24:16 +1000 Subject: [PATCH] Glitch with threading --- client/lobby.cpp | 102 +++++++++++++++++++--------------- client/lobby.hpp | 7 ++- libs/common/network_queue.cpp | 28 +++++++++- libs/common/network_queue.hpp | 2 +- 4 files changed, 90 insertions(+), 49 deletions(-) diff --git a/client/lobby.cpp b/client/lobby.cpp index 3dd0ab9..d83940a 100644 --- a/client/lobby.cpp +++ b/client/lobby.cpp @@ -26,10 +26,17 @@ Lobby::Lobby() { serverList.push_back({"bar",{0,0}}); serverList.push_back({"foobar",{0,0}}); + queueThread = SDL_CreateThread(networkQueue, nullptr); + + if (!queueThread) { + throw(runtime_error("Failed to create the network thread")); + } + BroadcastNetwork(); } Lobby::~Lobby() { + SDL_KillThread(queueThread); #ifdef DEBUG cout << "leaving Lobby" << endl; #endif @@ -44,7 +51,13 @@ void Lobby::FrameStart() { } void Lobby::Update(double delta) { - Receive(); + try { + //process all packets on the network queue + while(HandlePacket(popNetworkPacket())); + } + catch(exception& e) { + cerr << "Network Error: " << e.what() << endl; + } } void Lobby::FrameEnd() { @@ -126,50 +139,51 @@ void Lobby::KeyUp(SDL_KeyboardEvent const& key) { //Utilities //------------------------- -void Lobby::Receive() { - Packet p; - while(netUtil->Receive()) { - memcpy(&p, netUtil->GetInData(), sizeof(Packet)); - switch(p.type) { - case PacketType::PING: - //quick pong - p.type = PacketType::PONG; - netUtil->Send(&netUtil->GetInPacket()->address, &p, sizeof(Packet)); - break; - case PacketType::PONG: - // - break; -// case PacketType::BROADCAST_REQUEST: -// // -// break; - case PacketType::BROADCAST_RESPONSE: - PushServer(p.broadcastResponse); - break; -// case PacketType::JOIN_REQUEST: -// // -// break; -// case PacketType::JOIN_RESPONSE: -// // -// break; -// case PacketType::DISCONNECT: -// // -// break; -// case PacketType::SYNCHRONIZE: -// // -// break; -// case PacketType::PLAYER_NEW: -// // -// break; -// case PacketType::PLAYER_DELETE: -// // -// break; -// case PacketType::PLAYER_MOVE: -// // -// break; - default: - throw(runtime_error("Failed to recognize the packet type")); - } +int Lobby::HandlePacket(Packet p) { + switch(p.type) { + case PacketType::NONE: + //DO NOTHING + return 0; + break; + case PacketType::PING: + //quick pong + p.type = PacketType::PONG; + netUtil->Send(&netUtil->GetInPacket()->address, &p, sizeof(Packet)); + break; + case PacketType::PONG: + // + break; +// case PacketType::BROADCAST_REQUEST: +// // +// break; + case PacketType::BROADCAST_RESPONSE: + PushServer(p.broadcastResponse); + break; +// case PacketType::JOIN_REQUEST: +// // +// break; +// case PacketType::JOIN_RESPONSE: +// // +// break; +// case PacketType::DISCONNECT: +// // +// break; +// case PacketType::SYNCHRONIZE: +// // +// break; +// case PacketType::PLAYER_NEW: +// // +// break; +// case PacketType::PLAYER_DELETE: +// // +// break; +// case PacketType::PLAYER_MOVE: +// // +// break; + default: + throw(runtime_error("Failed to recognize the packet type")); } + return 1; } void Lobby::BroadcastNetwork() { diff --git a/client/lobby.hpp b/client/lobby.hpp index 115ba1b..97663e5 100644 --- a/client/lobby.hpp +++ b/client/lobby.hpp @@ -4,6 +4,7 @@ #include "base_scene.hpp" #include "service_locator.hpp" #include "packet_type.hpp" +#include "network_queue.hpp" #include "config_utility.hpp" #include "surface_manager.hpp" @@ -11,6 +12,8 @@ #include "button.hpp" #include "raster_font.hpp" +#include "SDL/SDL_thread.h" + #include #include @@ -40,7 +43,7 @@ protected: void KeyUp(SDL_KeyboardEvent const&); //utilities - void Receive(); + int HandlePacket(Packet p); void BroadcastNetwork(); void PushServer(BroadcastResponse&); @@ -58,6 +61,8 @@ protected: SDL_Rect listBox; std::vector serverList; ServerEntry* selectedServer = nullptr; + + SDL_Thread* queueThread = nullptr; }; #endif diff --git a/libs/common/network_queue.cpp b/libs/common/network_queue.cpp index ba2cbed..463dbad 100644 --- a/libs/common/network_queue.cpp +++ b/libs/common/network_queue.cpp @@ -1,15 +1,37 @@ #include "network_queue.hpp" +#include "service_locator.hpp" + +#include "udp_network_utility.hpp" #include "SDL/SDL_thread.h" #include +static SDL_sem* lock = SDL_CreateSemaphore(1); + static std::deque queue; int networkQueue(void*) { - // + UDPNetworkUtility* netUtil = ServiceLocator::Get(); + Packet p; + for(;;) { + SDL_SemWait(lock); + while(netUtil->Receive()) { + memcpy(&p, netUtil->GetInData(), sizeof(Packet)); + queue.push_back(p); + } + SDL_SemPost(lock); + SDL_Delay(10); + } } -Packet getPacket() { - // +Packet popNetworkPacket() { + SDL_SemWait(lock); + Packet p; + if (queue.size() > 0) { + Packet p = queue[0]; + queue.pop_front(); + } + SDL_SemPost(lock); + return p; } \ No newline at end of file diff --git a/libs/common/network_queue.hpp b/libs/common/network_queue.hpp index db17732..253de50 100644 --- a/libs/common/network_queue.hpp +++ b/libs/common/network_queue.hpp @@ -4,6 +4,6 @@ #include "packet_type.hpp" int networkQueue(void*); -Packet getPacket(); +Packet popNetworkPacket(); #endif