SFML网络多线程

时间:2015-12-08 00:39:59

标签: c++ multithreading class sfml

我需要创建一个线程来运行我游戏的网络部分。我更喜欢使用SFML线程,因为我的编译器还不支持C ++ 11线程。但是,包含该线程的类是使用make_shared()创建的。这是代码:

Game.cpp(并非所有代码都只是GameScreen的声明)

std::shared_ptr<Screen> Game::screen = std::make_shared<GameScreen>();

Screen只是一个包含纯虚函数的基类。您应该能够根据覆盖关键字找出哪些是虚拟的。

GameScreen.h

#ifndef GAMESCREEN_H
#define GAMESCREEN_H

#include <SFML/Graphics.hpp>

#include "Events.h"
#include "Screen.h"
#include "Map.h"
#include "Network.h"

class GameScreen : public Screen
{
public:
    GameScreen();

    void handleInput(sf::RenderWindow&) override;
    void update(sf::RenderWindow&, sf::View&) override;
    void render(sf::RenderWindow&) override;


private:
    Map m_map;
    Network network;
    Events eventManager;

    sf::Thread networkThread;
};

#endif // GAMESCREEN_H

GameScreen.cpp

#include <memory>
#include <iostream>

#include "GameScreen.h"
#include "Game.h"


GameScreen::GameScreen()
: networkThread(network.receive(eventManager))
{
    network.Connect();
}

void GameScreen::handleInput(sf::RenderWindow& window)
{
    /*Code*/
}

void GameScreen::update(sf::RenderWindow& window, sf::View& view)
{
    /*Code*/
}

void GameScreen::render(sf::RenderWindow& window)
{
    /*Code*/
}

Network.cpp(仅限接收功能)

void Network::Recieve(Events& eManager)
{
    sf::Packet m_rPacket;
    m_socket.receive(m_rPacket, m_serverIP, port);
    m_rPacket >> /*Data*/
    eManager.addEvent(tmp);
}

1 个答案:

答案 0 :(得分:1)

您可以在构造函数的初始化列表中使用this

MyClass::MyClass()
    : AClass(&MyFunction(*this))
{
    /*do stuff*/
}

但是,这在您的示例中没有意义,因为您尝试将指向MyFunction(或其不存在的返回值)的指针传递给AClass(),而您不能品质带参数的指针。实际上调用 MyFunction()时,您只能将参数传递给MyFunction()。你确定你实际上并不是指这样的东西:

MyClass::MyClass()
    : AClass()
{
    /*do stuff*/
    MyFunction(*this);
}

如果没有看到AClass()实际上是什么,或者预期输入是什么,就很难确定你想要做什么。

更新显然您没有在线程上阅读SFML documentationSFML TutorialThread构造函数将指向函数/方法的指针作为一个输入参数,将函数/方法的可选输入值作为单独的参数。试试这个:

class MyClass : public sf::Thread
{
private:
    static void MyFunction(MyClass &cls);
public:
    MyClass();
};

MyClass::MyClass()
    : sf::Thread(&MyClass::MyFunction, *this)
{
    /*do stuff*/
}

void MyClass::MyFunction(MyClass &cls)
{
    /*do stuff with 'cls'*/
}

或者这个,因为可以使用带有SFML线程的非静态类方法:

class MyClass : public sf::Thread
{
private:
    void MyFunction();

public:
    MyClass();
};

MyClass::MyClass()
    : sf::Thread(&MyClass::MyFunction, *this)
{
    /*do stuff*/
}

void MyClass::MyFunction()
{
    /*do stuff with 'this'*/
}

更新:根据您的新代码,您仍然无法正确构建sf::Thread对象(您是否阅读了我链接到的文档/教程?)。此外,您的线程需要访问GameScreen拥有的多个对象,因此您无法将它们全部传递给sf::Thread构造函数。你需要做更多这样的事情:

class GameScreen : public Screen
{
public:
    GameScreen();

    ...

private:
    ...
    Network network;
    Events eventManager;

    sf::Thread networkThread;
    void networkThreadFunc();
};

GameScreen::GameScreen()
    : networkThread(&GameScreen::networkThreadFunc, *this)
{
    network.Connect();
}

void GameScreen::networkThreadFunc()
{
    network.Receive(eventManager);
}