我正在浏览boost :: asio示例.我正在看 例4
令人困惑的是,此示例中的WaitHandler具有签名
void print(this)
但async_wait调用需要一个处理程序
处理程序的函数签名必须是:
void handler(const boost :: system :: error_code&error //操作结果.);
由于参数类型是函数签名的一部分,为什么在上面的例子中,async_wait接受一个参数不是boost :: system :: error_code类型的处理程序?
谢谢.
我正在尝试使用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)
任何人都可以解释为什么抛出未找到的服务或者如何解决这个问题?
重新提出问题(尽管已经解决了):
我在使用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++中使用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) 我有一个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).在这种情况下,两者之间有什么区别吗?
我正在使用boost :: asio(不经意的传输方案)实现一组简单的协议.它们在运行时受CPU限制.为了提高效率,我想尽量让两台主机都能正常工作.如果主机A可以在预先形成两个任务之间做出选择,其中一个将让主机B开始计算,而另一个则不允许,我希望主机A选择前者.
目前,io_service在async_writes之前运行计算密集型处理程序.除非tcp窗口已满(或某些类似条件阻止向socker写入数据),否则完成async_write几乎肯定会更好,而不是运行其他处理程序.
我见过asio的处理程序优先级队列示例.重新实现async_write以使用这样的优先级队列是解决我问题的唯一方法吗?
一个将永久运行并处理请求的服务器需要一个异步的代码部分,它将执行一些数据库查询并仅在有任何新的更改时才更新.服务器必须永远运行,并且这个函数一次又一次地执行db函数必须异步运行,这样就不会因为每隔'x'分钟更新一次而妨碍服务器.
如何最好地在c ++中异步处理?如何单独设置该功能以在守护程序上运行,以便它根本不阻塞服务器?
在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上运行。
我在用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是\\DISPLAY1和DeviceString是GPU厂商。使用MONITORINFOEXstruct给我的价值与相同DeviceName。
为了清楚起见,我正在寻找类似“ Samsung blah blah”之类的东西,或者屏幕分辨率页面上控制面板中显示的内容。
以下内容在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++ ×9
boost ×3
boost-asio ×3
linux ×3
aio ×1
asynchronous ×1
c ×1
c++11 ×1
codeblocks ×1
compile-time ×1
daemon ×1
frame-rate ×1
resolver ×1
service ×1
static-cast ×1
stdvector ×1
visual-c++ ×1
winapi ×1
xlib ×1
xorg ×1