小编sim*_*mon的帖子

回调的优缺点(std :: function/std :: bind)与接口(抽象类)

我正在使用Boost.Asio在C++ 11中创建服务器应用程序.我创建了一个类,Server它负责接受新的连接.它基本上只是:

void Server::Accept() {
  socket_.reset(new boost::asio::ip::tcp::socket(*io_service_));
  acceptor_.async_accept(*socket_,
                         boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}

void Server::HandleAccept(const boost::system::error_code& error) {
  if (!error) {
    // TODO
  } else {
    TRACE_ERROR("Server::HandleAccept: Error!");
  }
  Accept();
}
Run Code Online (Sandbox Code Playgroud)

我找到了两种方法(我确定还有更多)来"修复" TODO注释,即将套接字移动到应该去的地方.在我的情况下,我只想将它返回到拥有该Server实例的类实例(然后将其包装在一个Connection类中并将其插入到列表中).

  1. Server在其构造函数中有一个参数:std::function<void(socket)> OnAccept调用它HandleAccept.
  2. 我创建了一个抽象类,IServerHandler或者其他什么,它有一个虚方法OnAccept.Server需要IServerHandler在其构造函数的参数和类拥有实例的服务器实例扩展IServerHandler,构建Server*this作为参数.

选项1与选项2的优缺点是什么?还有更好的选择吗?我的Connection班级(OnConnectionClosed)中遇到了同样的问题.此外,根据我决定如何设计系统,它可能需要一个OnPacketReceivedOnPacketSent回调.

c++ interface callback boost-asio c++11

34
推荐指数
1
解决办法
6061
查看次数

写入大文件时,FileOutputStream.close非常慢

我有一个方法,使用此代码通过TCP套接字接收文件:

FileOutputStream fileStream = new FileOutputStream(filename.getName());
while (totalRead < size) {
    if (size - totalRead > CHUNKSIZE) {
        read = getInputStream().read(buffer, 0, CHUNKSIZE);
    } else {
        read = getInputStream().read(buffer, 0, size - totalRead);
    }
    totalRead += read;
    fileStream.write(buffer, 0, read);
    fileStream.flush();

    if (System.currentTimeMillis() > nextPrint) {
        nextPrint += 1000;
        int speed = (int) (totalRead / (System.currentTimeMillis() - startTime));
        double procent = ((double)totalRead / size) * 100;
        gui.setStatus("Reciving: " + filename + " at " + speed + " kb/s, " …
Run Code Online (Sandbox Code Playgroud)

java fileoutputstream

5
推荐指数
1
解决办法
9182
查看次数

将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

我正在尝试用 Java 读取二进制文件。我需要读取无符号 8 位值、无符号 16 位值和无符号 32 位值的方法。执行此操作的最佳(最快、最美观的代码)是什么?我在 C++ 中做到了这一点,并做了类似的事情:

uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
Run Code Online (Sandbox Code Playgroud)

但在 Java 中,如果 buffer[1] 包含一个因左移结果为 int (?) 而设置了符号位的值,则会导致问题。不是在特定位置仅 OR:ing 0xA5,而是在 0xFFFFA500 或类似的内容中 OR:s,这会“损坏”两个顶部字节。

我现在有一个代码,如下所示:

public long getUInt32() throws EOFException, IOException {
    byte[] bytes = getBytes(4);
    long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
    return value & 0x00000000FFFFFFFFL;
}
Run Code Online (Sandbox Code Playgroud)

如果我想转换四个字节 0x67 0xA5 0x72 0x50,结果是 …

java bit-manipulation

4
推荐指数
1
解决办法
3万
查看次数

将std :: tr1 :: shared_ptr与std :: function/std :: bind混合会导致编译器错误与更新的gcc

我需要使用一些旧的遗留代码std::tr1::shared_ptr.我需要包含的标题包含#include <tr1/memory>#include <tr1/functional>.在我的代码我想用std::functionstd::bind,因为我们的编译器支持这些.

这适用于gcc 4.6.3和4.7.3.在4.9.2,5.1.x和5.2.0中,这会导致编译器错误.它似乎是由于<tr1/functional>-include 而发生的.

我写了一个重现这个问题的小例子:

#include <tr1/memory>
#include <functional>
#include <tr1/functional>

struct Foo {
    void test(std::tr1::shared_ptr<int> i) {}
};

int main() {
    Foo f;
    std::function<void(std::tr1::shared_ptr<int>)> func = std::bind(&Foo::test, f, std::placeholders::_1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc-4.6.3,没有#include <tr1/functional>,编译好.在我的本地机器上测试过.

gcc-4.6.3,用#include <tr1/functional>,编译好.在我的本地机器上测试过.

gcc-5.1,没有#include <tr1/functional>,编译OK:http://ideone.com/XrkAXT

gcc-5.1,带#include <tr1/functional>编译器错误:http://ideone.com/sRWQLn

我没有使用任何std::tr1::function或根本没有std::tr1::bind,我从遗留代码中使用的唯一东西是一个std::tr1::shared_ptr对象.

为什么#include <tr1/functional>影响非tr1 …

c++ gcc tr1 c++11

3
推荐指数
1
解决办法
358
查看次数

打印Python中的值传递?

下面给出了这个课程,这将打印20_20.现在直到第5行代码相同,我不希望T.a当我改变值时改变值T1.a.怎么解决?

class Test: 
    def __init__(self, val): 
        self.a = val 

T = Test(10) 
T1 = T 
T1.a = 20 
print T.a + '__' + T1.a
Run Code Online (Sandbox Code Playgroud)

预期产量为10_20.

python python-2.7 python-3.x

-3
推荐指数
1
解决办法
54
查看次数