I think I fixed it.
Apperantly, I need to wrap it in std::ref
void Connect(string server, short port)
{
workerThread = thread(&Network::ThreadRoutine, server, port, ref(SendQueue), ref(ReceiveQueue));
}
I have never heard of std::ref before....
For anyone interested:
class Network
{
public:
Network(void)
{
}
~Network(void)
{
Disconnect();
}
void Connect(string server, short port)
{
workerThread = thread(&Network::ThreadRoutine, server, port, ref(SendQueue), ref(ReceiveQueue));
workerThread.detach();
}
void Disconnect()
{
SendQueue.push(string("..quit"));
}
void Send(string message)
{
SendQueue.push(message);
}
bool GetMessage(string &message)
{
return ReceiveQueue.try_pop(message);
}
private:
thread workerThread;
concurrent_queue<string> SendQueue;
concurrent_queue<string> ReceiveQueue;
static DWORD ThreadRoutine(string server, short port, concurrent_queue<string> &SendQueue, concurrent_queue<string> &ReceiveQueue)
{
if (enet_initialize () != 0){
return 1;
}
ENetHost* client = NULL;
client = enet_host_create (NULL, 1, 2, 0, 0);
if(client == NULL){
ReceiveQueue.push(string("An error occurred while trying to create an ENet client host."));
} else {
ENetAddress address;
ENetEvent event;
ENetPeer *peer = NULL;
enet_address_set_host (& address, server.c_str());
address.port = port;
peer = enet_host_connect (client, & address, 2, 0);
if (peer == NULL){
ReceiveQueue.push(string("No available peers for initiating an ENet connection."));
} else {
if (enet_host_service (client, & event, 5000) > 0 && event.type == ENET_EVENT_TYPE_CONNECT){
ReceiveQueue.push(string("Connection to server succeeded."));
bool Quit = false;
while(!Quit)
{
string SendString;
if(SendQueue.try_pop(SendString))
{
if(strcmp(SendString.c_str(), "..quit") == 0){
ReceiveQueue.push(string("Exiting worker thread."));
Quit = true;
enet_peer_disconnect(peer, 0);
if(enet_host_service (client, & event, 3000) > 0)
{
switch (event.type)
{
case ENET_EVENT_TYPE_RECEIVE:
enet_packet_destroy (event.packet);
break;
case ENET_EVENT_TYPE_DISCONNECT:
ReceiveQueue.push(string("Disconnection succeeded."));
continue;
}
}
enet_peer_reset(peer);
continue;
} else {
ENetPacket* packet = enet_packet_create (SendString.c_str(), SendString.length() + 1, ENET_PACKET_FLAG_RELIABLE);
enet_peer_send (peer, 0, packet);
}
}
if(enet_host_service(client, &event, 1) > 0)
{
switch (event.type)
{
case ENET_EVENT_TYPE_RECEIVE:
/*printf ("A packet of length %u containing %s was received from %s on channel %u.\n",
event.packet -> dataLength,
event.packet -> data,
event.peer -> data,
event.channelID);*/
ReceiveQueue.push(string((char*)event.packet->data));
enet_packet_destroy (event.packet);
break;
case ENET_EVENT_TYPE_DISCONNECT:
ReceiveQueue.push(string("Disconnected."));
Quit = true;
}
}
}
} else {
enet_peer_reset (peer);
ReceiveQueue.push(string("Connection to server failed."));
}
}
}
SendQueue.clear();
if(client) enet_host_destroy(client);
enet_deinitialize();
return 0;
}
};