我正在创建一个程序,它将从远程计算机接收消息,并需要将消息写入磁盘上的文件.我发现的困难在于这个程序的目的是测试接收消息的库的性能,因此,我需要确保将消息写入磁盘不会影响库的性能.该库通过回调函数将消息传递给程序.另一个困难是解决方案必须与平台无关.
我有什么选择?
我想到了以下几点:
boost:asio写入文件,但似乎(见本文档),以文件异步写入是在该库的Windows特定的部分-所以这不能使用.boost::interprocess创建一个消息队列,但这个文件表明,有3种方法,其中的信息可以发送,并且所有的方法将需要程序来阻止(隐含与否)如果消息队列已满,我不能冒险.std::deque<MESSAGES>从回调函数推送到deque,并在写入文件时(在单独的线程上)弹出消息,但不保证 STL容器是线程安全的.我可以锁定推进,然后弹出deque但我们正在谈论连续消息之间的47微秒,所以我想完全避免锁定.有没有人对可能的解决方案有任何想法?
c++ multithreading thread-safety boost-asio boost-interprocess
我有一个Inno安装程序安装程序在我的机器上运行良好(Win 7 32位),但在测试机器上也没有工作(也是Win 7 32位).经过一番调查后,我发现原因是当UAC被设置为任何不通知我的东西时会出现问题.但是,如果我右键单击安装程序,并选择以管理员身份运行,则安装程序可正常运行.
然后我尝试修改安装程序的嵌入式清单(下面描述的方法),以便它始终以管理员身份运行,但这不能按我的意愿运行.我使用命令获得了原始清单
mt.exe -inputresource:installer.exe -out:installer.exe.manifest
Run Code Online (Sandbox Code Playgroud)
然后,我使用文本编辑器打开提取的清单并更改了该行
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
Run Code Online (Sandbox Code Playgroud)
至
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
Run Code Online (Sandbox Code Playgroud)
然后,我尝试通过运行命令来应用生成的清单
mt.exe -manifest installer.exe.manifest -updateresource:installer.exe;#1
Run Code Online (Sandbox Code Playgroud)
但清单工具给了我错误
mt.exe:manifest authoring error c1010001:属性"level"的值在不同的清单片段中不相等.
我也尝试将命令更改为
mt.exe -manifest installer.exe.manifest -outputresource:installer.exe;#1
Run Code Online (Sandbox Code Playgroud)
但这导致整个安装程序只被资源覆盖(即实际安装程序丢失).
我还尝试使用Visual Studio(资源编辑器)打开安装程序可执行文件,修改清单并保存文件,但这与我使用的第二个mt.exe命令的结果相同.
有人知道我做错了什么,或者我错过了什么?