【发布时间】:2016-03-12 18:59:51
【问题描述】:
我需要创建一个线程来运行我的游戏的网络部分。我更喜欢使用 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);
}
【问题讨论】:
-
呃,方法为什么不能引用this???而且,如果你想引用类实例...... 那你为什么要让它成为静态的?!?
-
我需要将其设为静态,否则 SFML 线程无法正常工作
-
SFML
thread类可以被赋予一个非静态类方法。 -
@Cronnoc:我在这里听到XY Problem。具体来说:1)如果您想将“this”引用传递给方法,您可以这样做。 2)但是,在几乎调用的情况下,最好的解决方案是使方法非堆栈并简单地使用“内置”“this”引用。 3) 您确实 NOT 需要将方法设为“静态”以适应 SFML 线程。请参阅其他回复。 4) 如果您在使非静态方法正常工作时仍有疑问/问题,请更新您的帖子并提供详细信息。
-
@paulsm4 好的,我将重写我的问题,询问问题而不是我想出的解决方案。
标签: c++ multithreading class sfml