【发布时间】:2020-05-21 10:38:46
【问题描述】:
我正在尝试做一个 std::tread 所以我已经看过一些教程但是当我做同样的事情时(我认为)它不会编译。
这是我的 Network_ 类,“receiveFromServer”成员函数应该是线程的。
class Network_ {
public:
bool errorInfo(sf::Socket::Status status) {
switch (status)
{
case sf::Socket::Done:
return true;
break;
case sf::Socket::NotReady:
std::cout << "The socket is not ready to send / receive data yet." << std::endl;
return false;
break;
case sf::Socket::Partial:
std::cout << "The socket sent a part of the data." << std::endl;
return false;
break;
case sf::Socket::Disconnected:
std::cout << "The socket has been disconnected." << std::endl;
return false;
break;
case sf::Socket::Error:
std::cout << "An unexpected error happened." << std::endl;
return false;
break;
default:
return false;
break;
}
}
void receiveFromServer(sf::RenderWindow &RW) {
sf::Packet packet;
std::string string;
while (RW.isOpen())
if (_selector.wait() && _selector.isReady(_socket)) {
if (errorInfo(_socket.receive(packet))) {
packet >> string;
packet.clear();
std::cout << string << std::endl;
}
}
else
RW.close();
}
private:
sf::SocketSelector _selector;
sf::TcpSocket _socket;
这是我的主要部分
Network_ network;
if (network.connectToServer(ip, port)) {
Window_ window;
sf::RenderWindow *RW = window.create_window("test", 10);
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW));
return gameLoop(*RW);
}
我得到了这个错误static assertion failed: std::thread arguments must be invocable after conversion to rvalues,下面有很多 sh*t。
有人可以帮帮我吗?谢谢:)
【问题讨论】:
-
请提供一个最小的例子。您不需要整个 Network 类,它会增加噪音。
-
Network_::receiveFromServer需要sf::RenderWindow &类型的 arg,但您实际上传递了sf::RenderWindow *&。错字? -
如果传递一个指针,为什么要传递对该指针的引用?只需按值传递即可。
-
@G.M.谢谢我发现错误是我的错,我不得不这样做:std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(*RW));这是一个 2 小时卡住了这个;(谢谢大家有一个美好的一天
-
@Kalicliq 下一次,这是一个最小可重现示例的样子:wandbox.org/permlink/ZcfS5xlALeDHHIlb
标签: c++ multithreading sfml