我目前正在尝试首次使用boost :: asio进行一些简单的tcp网络,而且我已经发现了一些我不确定如何处理的东西.据我所知,io_service.run()方法基本上是一个循环,它运行直到没有其他事情要做,这意味着它将一直运行,直到我释放我的小服务器对象.由于我已经设置了某种主循环,我宁愿从那里手动更新网络循环只是为了简单起见,我认为io_service.poll()会做我想要的,有点像这样:
void myApplication::update()
{
myIoService.poll();
//do other stuff
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我仍然想知道这种方法是否有缺点,因为这似乎不是处理boost :: asios io服务的常用方法.这是一种有效的方法还是我应该在非阻塞的额外线程中使用io_service.run()?
我知道,我不是第一个尝试在OSX上使用Cocoa和现有的c/c ++主循环的人,但我并不是真的喜欢我到目前为止遇到的解决方案所以我提出了一个不同的想法我'我想讨论一下.我发现的最常见的方式(在glut,glfw,SDL以及QT中我认为)是使用轮询来替换NSApplications run方法并自行处理事件:
nextEventMatchingMask:untilDate:inMode:dequeue:
Run Code Online (Sandbox Code Playgroud)
这有一个很大的缺点,即cpu永远不会真正空闲,因为你必须轮询整个时间来检查是否有任何新事件,而且它不是NSApplications运行函数内部唯一的事情,所以它可能会破坏一些细节,如果你用这个替代品.
所以我想做的是保持cocoa runLoop完好无损.想象一下,你有自己的计时器方法在c ++中实现,通常会在你的主循环中进行管理和触发(这只是一个小部分作为例子).我的想法是将所有循环部分移动到辅助线程(因为据我所知,NSApplication运行需要从主线程调用),然后将自定义事件发布到NSApplication的派生版本中,该版本在其中适当地处理它们sendEvent:方法.例如,如果我的计时器在我的c ++循环测量中测量,我会向NSApplication发布一个自定义事件,然后运行我的应用程序的loopFunc()函数(也驻留在mainthread中),该函数适当地将事件发送到我的c ++事件链中.首先,您认为这是一个很好的解决方案吗?如是,
otherEventWithType:location:modifierFlags:timestamp:windowNumber:context:subtype:data1:data2:
然后使用类似的东西:
[NSApp postEvent:atStart:]
Run Code Online (Sandbox Code Playgroud)
通知NSApplication.
我宁愿发布没有任何窗口信息的事件(在otherEventWithType中),我可以简单地忽略那部分吗?
然后我想象覆盖NSApplications sendEvent函数类似于:
- (void)sendEvent:(NSEvent *)event
{
//this is my custom event that simply tells NSApplication
//that my app needs an update
if( [event type] == NSApplicationDefined)
{
myCppAppPtr->loopFunc(); //only iterates once
}
//transform cocoa events into my own input events
else if( [event type] == NSLeftMouseDown)
{
...
myCppAppPtr->loopFunc(); //also run the loopFunc to propagate input events
}
...
//dont break the cocoa event …Run Code Online (Sandbox Code Playgroud) 我很确定没有办法明确地做到这一点,但我想问一下,如果有更好的方法.我有一个基类A和一个派生类B,现在我有一个指向B*的st*:: A*列表,我想将这个A*列表复制到一个std :: vector of B*基本上我想这样做:
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec = std::vector<B*>(aList.begin(), aList.end());
Run Code Online (Sandbox Code Playgroud)
我很确定当列表和向量是相同类型时(例如两者都是A*),这应该编译,但因为在这种情况下A*是B*的基类我不能这样做,因为我必须明确地进行类型转换,例如:
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec;
bVec.reserve(aList.size());
std::list<A*>::iterator it = aList.begin();
for(it; it!=aList.end(); ++it)
{
B* b = static_cast<B*>(*it);
bVec.push_back(b);
}
Run Code Online (Sandbox Code Playgroud)
有没有比我的第二种方法更优雅的方式,还是我必须这样做?
我刚刚在OSX Lion上开发的项目中更新了升级版本1.48.0,该项目还包括Cocoa头文件.在这样做后,我得到了一大堆错误,所有错误都指向has_prefix_operator.hpp和has_binary_operator.hpp,它们都指向如下行:
BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
Run Code Online (Sandbox Code Playgroud)
../../boost_1_48_0/boost/type_traits/detail/has_binary_operator.hpp:157:4:错误:预期表达式[1]
在尝试之后,由于我无法真正理解这些错误,我注意到如果我切换包含顺序:
#import <Cocoa/Cocoa.h>
#include <boost/type_traits.hpp>
Run Code Online (Sandbox Code Playgroud)
至
#include <boost/type_traits.hpp>
#import <Cocoa/Cocoa.h>
Run Code Online (Sandbox Code Playgroud)
事情神奇地工作.我对此非常困惑,因为它与之前的提升版本一起工作得很好,我不知道为什么会发生这种情况.关于可能发生的事情的任何想法?
谢谢!
可能重复:
如何计算2目录路径之间的相对路径?
我需要计算从一个目录到另一个目录的相对路径(即我设置相对于工作目录的路径,并且想要计算来自任何父/子目录的相应路径).在Python中这样做的好方法是什么?我找不到这个问题.
谢谢!
我想知道一种从C++应用程序打开OS X上的默认浏览器然后打开请求的URL的方法.
编辑:我这样解决了:
system("open http://www.apple.com");
Run Code Online (Sandbox Code Playgroud) 我想使用AVFoundation在osx上显示视频.我想在运行时从原始数据初始化电影.根据这个文件:https ://developer.apple.com/library/mac/#technotes/tn2300/_index.htmlAVAsset相当于QTKit的 QTMovie.QTMovie具有movieWithData:error:从数据加载视频的功能,而我找不到类似的东西AVAsset.那么,有可能在AVFoundation中做同样的事情吗?
谢谢
我想在c ++中进行一些解析和标记以用于学习目的.现在我经常在网上阅读这个主题时遇到野牛/ yacc和lex.使用STL或boost :: regex或者甚至只是C编写的标记器/解析器是否会有任何市长的好处?
在c ++ 11中是否有任何可释放的方法来检测当前线程是否是主线程?或者我是否必须手动保存主线程的线程ID,std::this_thread::get_id()然后有一个这样的例程:
bool isMainThread()
{
return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id();
}
Run Code Online (Sandbox Code Playgroud)
有一个共同的方法来做到这一点?以上解决方案是否有效?
谢谢
我试图在xcode中将wstring/wchar_t打印到控制台但不幸的是它只适用于基本字符(我认为是ascii)字符,其他所有内容都以数字显示,例如以下内容:
std::cout << "äöüu"<< std::endl;
std::wcout << L"äöüu" << std::endl;
Run Code Online (Sandbox Code Playgroud)
虽然cout版本按预期打印"äöüu"但是在使用wchar_t时会得到以下内容:
\ 344\366\374U
关于如何解决这个问题的任何想法?我使用xcode 3.2.2 64位和gcc 4.2,文件编码设置为Unicode(UTF-8)
谢谢!