小编Nmd*_*ery的帖子

Boost :: asio async_wait处理程序签名

我正在浏览boost :: asio示例.我正在看 例4

令人困惑的是,此示例中的WaitHandler具有签名

void print(this)

但async_wait调用需要一个处理程序

处理程序的函数签名必须是:

void handler(const boost :: system :: error_code&error //操作结果.);

来源:Boost文档

由于参数类型是函数签名的一部分,为什么在上面的例子中,async_wait接受一个参数不是boost :: system :: error_code类型的处理程序?

谢谢.

boost boost-asio

6
推荐指数
1
解决办法
5984
查看次数

Boost Asio tcp :: resolver:找不到服务

我正在尝试使用Boost Asio创建一个HTTP客户端.我从asio复制了同步客户端示例,编译然后运行.不幸的是,在我的日志中,它显示找不到服务.当我跟踪代码时,我发现它是从以下代码抛出的:

boost::asio::io_service io_service;
// Get a list of endpoints corresponding to the server name.
tcp::resolver resolver(io_service);
//->if i removed the http, it has no error
tcp::resolver::query query("host.com", "http");
//->This part throws the service not found
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么抛出未找到的服务或者如何解决这个问题?

c++ service boost boost-asio resolver

6
推荐指数
1
解决办法
4084
查看次数

C++ linux:dlopen找不到.so库

重新提出问题(尽管已经解决了):

我在使用dlopen(3)在linux上加载共享对象库时遇到了麻烦.该库是由我构建的库系统的一部分,它们都在运行时由中央可执行文件加载.所有这些都被组织到Code :: Blocks中的单个工作区中,其中每个项目在名为Source的目录中被赋予其自己的文件夹,该目录将随程序一起提供.可执行文件的构建目录是从其自己的源代码向后的两个目录,因此exectuable和Source文件夹位于同一目录中.这些库也构建到与可执行文件相同的目录中,所以我自然会传递库的名称我正试图打开如图所示:

int main(int argc, char** argv) {
    void* hLibrary = dlopen("libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
    if(hLibrary == NULL) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }

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

当构建目录与源代码相同时,这一点正在工作,直到我将源代码的目录更改为上述安排.此时的问题是dlerror()返回"无法打开libLibrary.so:没有这样的文件或目录",即使该文件明显存在并且与可执行文件位于同一目录中.然后我尝试传入"/libLibrary.so",因为根据dlopen(3)上的手册页,添加/表示相对目录.这返回了相同的错误.

对此的解决方案是需要"./" - 其中"." 表示可执行文件的工作目录 - 并且需要在Code :: Blocks中将工作目录更改为要构建可执行文件的位置.以下工作完美:

void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
Run Code Online (Sandbox Code Playgroud)

这并没有真正显示完整的解决方案,但以下基本上相当于我正在做的事情:

void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
Run Code Online (Sandbox Code Playgroud)

希望这能更好地解释情况.

c++ linux codeblocks dynamic-library

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

Xlib:关闭窗口总是会导致致命的IO错误?

我不确定为什么会发生这种情况,但是我在C++中使用Xlib创建的任何窗口都会在我尝试关闭时使用X按钮向终端输出错误.我可以通过编程方式关闭它而没有错误,它只是执行它的X按钮.

错误如下:

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 483 requests (483 known processed) with 0 events remaining.
Run Code Online (Sandbox Code Playgroud)

请求的数量每次都不同,但总有0个事件剩余.为什么会这样?原因似乎不是我的代码,因为它无论如何都会执行此操作并且不向队列发送任何关闭事件.我试过拦截Atom WM_WINDOW_DELETE,当我关闭窗口时它不会运行预期的代码.

编辑:添加了事件循环代码.

while(XPending(display)) {
    XNextEvent(display, &event);

    pthread_mutex_unlock(&mutex);

    if(event.type == Expose) {
        XWindowAttributes getWindowAttributes;

        pthread_mutex_lock(&mutex);

        XGetWindowAttributes(display, window, &getWindowAttributes);

        if(state.currentState == STATE_NORMAL) {
            state.normX = getWindowAttributes.x;
            state.normY = getWindowAttributes.y;
            state.normWidth = getWindowAttributes.width;
            state.normHeight = getWindowAttributes.height;
        }

        pthread_mutex_unlock(&mutex);

        glViewport(0, 0, getWindowAttributes.width, getWindowAttributes.height);
    } else if(event.type == KeyPress) {
        return false;
    } else if(event.type == ClientMessage) {
        std::cout<<"X Button …
Run Code Online (Sandbox Code Playgroud)

c c++ linux xlib

6
推荐指数
1
解决办法
3512
查看次数

为什么不允许这个static_cast?

我有一个A类的对象,我想在自定义堆栈对象上分配.为此,我只需将堆栈指针移动到对象大小的字节数并返回其先前的值:

class A : public B {}; //B is from a precompiled library

class stack {
public:
    stack(void): _top(&_storage[0]) {}

    template <typename T>
    inline T* push(void) {
        T* ptr = static_cast<T*>(_top);

        _top += sizeof(T);

        return ptr;
    }

    //...

private:
    char _storage[1024];
    char* _top;
};

stack _stack;

int main(int argc, char** argv) {
    A* a = _stack.push<A>(); //ignore the lack of a constructor call

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

Visual C++只是告诉我static_cast无法从char*转换为A*.常规的C样式转换不会给我这个错误,但我宁愿更明确并避免动态转换(A继承自另一个类,但没有贡献给它没有的vtable).在这种情况下,两者之间有什么区别吗?

c++ static-cast visual-c++ c++11

6
推荐指数
2
解决办法
7828
查看次数

如何通过运行其他处理程序强制boost :: asio优先完成async_write调用?

我正在使用boost :: asio(不经意的传输方案)实现一组简单的协议.它们在运行时受CPU限制.为了提高效率,我想尽量让两台主机都能正常工作.如果主机A可以在预先形成两个任务之间做出选择,其中一个将让主机B开始计算,而另一个则不允许,我希望主机A选择前者.

目前,io_service在async_writes之前运行计算密集型处理程序.除非tcp窗口已满(或某些类似条件阻止向socker写入数据),否则完成async_write几乎肯定会更好,而不是运行其他处理程序.

我见过asio的处理程序优先级队列示例.重新实现async_write以使用这样的优先级队列是解决我问题的唯一方法吗?

c++ boost boost-asio

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

c ++中的异步处理

一个将永久运行并处理请求的服务器需要一个异步的代码部分,它将执行一些数据库查询并仅在有任何新的更改时才更新.服务器必须永远运行,并且这个函数一次又一次地执行db函数必须异步运行,这样就不会因为每隔'x'分钟更新一次而妨碍服务器.

如何最好地在c ++中异步处理?如何单独设置该功能以在守护程序上运行,以便它根本不阻塞服务器?

c++ asynchronous daemon aio

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

C ++ Linux:获取监视器的刷新率

在Windows中,winapi提供了报告有关监视器的信息的功能:

DEVMODE dm;
dm.dmSize = sizeof(DEVMODE);

EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);

int FPS = dm.dmDisplayFrequency;
Run Code Online (Sandbox Code Playgroud)

在Linux上相当于什么?Linux手册页将我定向到allegro库函数,但我不仅不使用allegro,而且该函数来自该库的过时版本,而且据说只能在Windows上运行。

c++ linux frame-rate xorg

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

获取监视器的名称

我在用winapi检索监视器名称时遇到了一些麻烦。根据stackoverflow上的其他条目,获取监视器名称的正确方法是:

EnumDisplayDevices(nullptr, 0, &oDisplayDevice, 0);

char lpszDeviceName[32];
memcpy(lpszDeviceName, oDisplayDevice.DeviceName, 32);

EnumDisplayDevices(lpszDeviceName, 0, &oDisplayDevice, 0);

char lpszMonitorName[128];
memcpy(lpszMonitorName, oDisplayDevice.DeviceString, 128);
Run Code Online (Sandbox Code Playgroud)

但是,第二次EnumDisplayDevices返回FALSE。第一次,DeviceName\\DISPLAY1DeviceString是GPU厂商。使用MONITORINFOEXstruct给我的价值与相同DeviceName

为了清楚起见,我正在寻找类似“ Samsung blah blah”之类的东西,或者屏幕分辨率页面上控制面板中显示的内容。

c++ winapi

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

非constexpr函数在constexpr构造函数中的使用是有效的

以下内容在gcc 4.8中有效:

class Value {
    private:
        static std::vector<float> compile_time_vector;
        const bool compile_time_bool;

        static bool f(void) {
            compile_time_vector.push_back(2.3);

            return true;
        }

    public:
        template <typename type_t>
        constexpr Value(const type_t& value): compile_time_bool(f()) {}
};
Run Code Online (Sandbox Code Playgroud)

std :: vector不是为了在编译时工作而设计的,那么这个代码到底是什么类型的代码呢?我已经使用了这个类来确保它没有经过优化.

c++ compile-time stdvector

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