【问题标题】:SFML Threads errorSFML 线程错误
【发布时间】:2013-10-04 04:25:23
【问题描述】:

我正在尝试使用 SFML 创建线程应用程序,但在创建线程时遇到了这个错误。

error C2064: term does not evaluate to a function taking 1 arguments

这是我的代码,它的主要作用是设置网络监听和接受,我想要实现的是一个可以通过main 运行的网络线程。

#include "Networking.h"

Networking::Networking(void)
{
    sf::Thread thread(&Networking::TCPSocket, 1000);
    thread.launch();
}

Networking::~Networking(void)
{
    SetNetworking(false);
}

void Networking::TCPSocket(int port)
{
    InitNetworking();

    sf::TcpSocket client;
    sf::TcpListener listener;

    // bind the listener to a port
    if (listener.listen(port) != sf::Socket::Done)
    {
        Logger::Wrn("Could not bind to port:", port);
    } else {
        Logger::Log("Successfully bound to port:", port);
    }

    Logger::Log("Ready to receive connections");
    while(IsNeworkRunning() == true)
    {
        if(listener.accept(client) == sf::Socket::Done)
        {
            Logger::Log("New connection received from");
        } else {
            Logger::Wrn("Connection from", client.getRemoteAddress(), "could not connect");
        }
    }
}

void Networking::SetNetworking(bool i)
{
    i = this->_networkStarted;
}

bool Networking::IsNeworkRunning()
{
    if(_networkStarted == false)
    {
        Logger::Err("Failed to initialise the networking");
        exit(EXIT_FAILURE);
    } else {
        return _networkStarted;
    }
}

void Networking::InitNetworking()
{
    SetNetworking(true);
    Logger::Log("Network initialised");
}

如果您需要标头,我可以发布它,但我不确定您是否会发布。

提前感谢您的帮助。

【问题讨论】:

  • 当调用一个指向成员函数的指针时,你也需要一个指向将要调用它的对象的指针。
  • 但是如果我这样做,那么我如何添加函数参数
  • 传入绑定函数,通过std::bind 或类似方法创建。

标签: c++ multithreading sfml


【解决方案1】:

非静态成员函数(属于类的)有一个隐藏参数——指向类实例的指针。让我们以您的课程为例:

Networking foo;
foo.TCPSocket(1000);

虽然它看起来不像有两个参数,但隐含一个隐藏的参数:指向对象foo 的指针。在 C 风格的 OOP 代码中,同样的事情可以通过让一个函数获取一个指向对象的指针和任何参数来完成,所以你可以这样写:

CStyleTCPSocket(&foo, 1000);

在 C++ 中,引擎盖下的工作方式类似,但有一些语法糖可以让事情看起来更漂亮一些。来电:

foo.TCPSocket(1000);

变成:

Networking::TCPSocket(&foo, 1000); //not legal code, it's just to make a point

那么如何解决你的问题呢?当你像这样启动线程时:

std::thread someThread(&Networking::TCPSocket, 1000);

编译器正在查看 TCPSocket 并思考“等等,我需要两个参数,指向对象的指针整数!”当你在 in 对象中时,指向对象的指针是什么? this 关键字。将它们捆绑在一起:

std::thread someThread(&Networking::TCPSocket, this, 1000);

这应该可以解决问题!

编辑:

sf::Thread 不支持多个参数,因为它是与不支持 C++11 Source 的编译器一起使用的幼稚实现。 C++11 STL 标头中的std::thread ` 将正确处理多个参数。

【讨论】:

  • 啊,我的错,我认为sf::Threadstd::thread 的早期权宜之计。你用的是什么编译器?如果它支持std::thread,它将解决您的所有问题。 SFML 实际上建议您尽可能使用std::thread,因为他们自己的在很多方面都更糟:sfml-dev.org/tutorials/2.0/system-thread.php
  • 我正在使用视觉工作室
  • 如果您使用的是 Visual Studio 2012 或 2013,您可以使用 #include <thread> 并使用 std::thread 而不是 sf::Thread,这是一个更好的多线程类并支持我的答案中的代码.
猜你喜欢
  • 2013-09-09
  • 2018-10-02
  • 2023-03-30
  • 1970-01-01
  • 2016-03-12
  • 2011-09-09
  • 2018-08-26
  • 2013-12-11
相关资源
最近更新 更多