我按照CMake FAQ条目"如何使用静态运行时构建我的MSVC应用程序?"中的说明进行操作.集中选择一组嵌套的CMake项目的MSVC运行时(它们作为Git子模块引入并使用CMake find_package()指令添加到主项目中).
所以,我写了这个CMake宏:
macro(configure_msvc_runtime)
if(MSVC)
# Default to statically-linked runtime.
if("${MSVC_RUNTIME}" STREQUAL "")
set(MSVC_RUNTIME "static")
endif()
# Set compiler options.
set(variables
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
if(${MSVC_RUNTIME} STREQUAL "static")
message(STATUS
"MSVC -> forcing use of statically-linked runtime."
)
foreach(variable ${variables})
if(${variable} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
endif()
endforeach()
else()
message(STATUS
"MSVC -> forcing use of dynamically-linked runtime."
)
foreach(variable ${variables})
if(${variable} MATCHES "/MT")
string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}") …Run Code Online (Sandbox Code Playgroud) 是否有任何替代方法可以使用getframe和saveas将图形内容保存到光栅图像中以进行进一步处理?
方法1: getframe
h = figure('visible', 'off');
a = axes('parent', h);
% render using `scatter3()` or other plot function.
content = frame2im(getframe(h));
Run Code Online (Sandbox Code Playgroud)
这具有显示图形在调用中执行屏幕捕获的严重缺点,getframe()并且当在循环中执行这样的渲染时(即,content在每次迭代时将其保存为视频帧)存在问题.
方法2: saveas
h = figure('visible', 'off');
a = axes('parent', h);
% render using `scatter3()` or other plot function.
saveas(h, '/path/to/file.png');
content = imread(/path/to/file.png');
Run Code Online (Sandbox Code Playgroud)
这种方法具有写入磁盘的严重缺点,这在多线程应用程序中存在问题,并且比直接渲染到内存要慢.因为saveas()在调用PNG编码器之前显然会渲染到内存,所以我想要的是可能的,但我在MATLAB文档中找不到任何只执行渲染部分的函数.
问题:
您是否知道将任意axes内容渲染到光栅图像的替代方法?
我一直在使用"Unicode字符串"在Windows中,只要是......我了解的Unicode(如后毕业).然而,Win32API非常宽松地提到"unicode"总是让我感到困惑.特别是,MSN提到的"unicode"变体是UTF-16(尽管"宽字符"术语来自于它曾经是UCS-2,而不是Unicode).但是,它几乎没有提到Unicode规范化.
MSN有几页关于Unicode和Unicode规范化表单和函数来更改规范化表单.规范化页面甚至说:
Win32和.NET Framework支持所有四种规范化形式.
但是,我没有在文档中找到Win32 API使用(或理解)归一化形式的任何地方.
问题1:默认情况下,用户输入(例如编辑控件)和转换的标准化形式是什么MultiByteToWideChar()?
问题2:传递给Win32API函数的字符串必须是特定的规范化形式,还是内核和文件系统规范化无关?
我今天早上和一位同事就静态变量初始化顺序进行了讨论.他提到了Nifty/Schwarz计数器,我(有点)感到困惑.我理解它是如何工作的,但我不确定这在技术上是否符合标准.
假设以下3个文件(前两个是来自更多C++习语的 copy-pasta ):
//Stream.hpp
class StreamInitializer;
class Stream {
friend class StreamInitializer;
public:
Stream () {
// Constructor must be called before use.
}
};
static class StreamInitializer {
public:
StreamInitializer ();
~StreamInitializer ();
} initializer; //Note object here in the header.
Run Code Online (Sandbox Code Playgroud)
//Stream.cpp
static int nifty_counter = 0;
// The counter is initialized at load-time i.e.,
// before any of the static objects are initialized.
StreamInitializer::StreamInitializer ()
{
if (0 == nifty_counter++)
{
// Initialize Stream …Run Code Online (Sandbox Code Playgroud) 我刚刚偶然发现了Fabric,文档并没有真正说明它是如何工作的.
我有根据的猜测是你需要在客户端和服务器端安装它.Python代码存储在客户端,并在运行命令时通过Fabric的wire-protocol传输.服务器通过~/.ssh/authorized_keys当前用户(或特殊用户,或在fab命令的主机名中指定)的文件接受使用OpenSSH SSH守护程序的连接.
这是否正确?如果没有,它是如何工作的?
我只是关于Qt事件系统和QEvent类的文档.我对该QObject::event()方法的行为感兴趣.文件说明:
此虚函数接收事件到对象,如果事件e被识别和处理,则应返回true.
false从event()方法返回时的预期行为是什么?还有什么办法来处理这个事件?事件是否自动转发到父对象?
注意:我知道源代码可用,而且我有副本.我理想地寻找解决此行为的一些文档.
在昨天的编程采访中,我必须写的一个程序最终得到了这样的结论:
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
Run Code Online (Sandbox Code Playgroud)
我熟悉返回值优化(RVO),所以我刚才提到返回向量不会导致流行编译器上的副本(有一个返回语句作为最后一行,并且没有控制路径可以返回另一个对象)我写的代码).
但是,面试官告诉我,由于Blob可能是一个复杂的用户定义类型(UDT),编译器可能无法执行RVO.他进一步补充说,返回a std::vector<Blob*>将增加编译器执行复制省略的机会.
据我所知,编译器执行RVO的能力与返回的对象类型完全无关,除非是非可复制对象,编译器将(应该?)拒绝代码,即使生成的代码也是如此无需调用复制构造函数即可编译.
那么,面试官是对的吗?复杂的返回类型是否会阻止编译器应用RVO?
我偶然发现了微软的HTTP Server API.介绍说明:
HTTP Server API使应用程序无需使用Microsoft Internet Information Server(IIS)即可通过HTTP进行通信.应用程序可以注册以接收特定URL的HTTP请求,接收HTTP请求以及发送HTTP响应.HTTP Server API包括SSL支持,以便应用程序可以在没有IIS的情况下通过安全HTTP连接交换数据.它还可以与I/O完成端口配合使用.
找到这个很酷的东西,我仔细研究了两个版本API的功能列表.现在,文档中提到I/O完成端口的唯一其他部分是HttpReceiveHttpRequest()函数.最后一个参数是一个可选OVERLAPPED结构,具有以下描述:
对于异步调用,设置
pOverlapped为指向OVERLAPPED结构; 对于同步调用,将其设置为NULL.同步调用将阻塞,直到请求已到达指定队列并且已检索到其中的一些或全部,而异步调用会立即返回ERROR_IO_PENDING,然后调用应用程序使用GetOverlappedResult()或I/O完成端口来确定操作何时完成.有关使用OVERLAPPED结构进行同步的更多信息,请参阅同步和重叠输入和输出.
没有其他信息,所有结构都是不透明的,故意隐藏连接信息.另请注意,同步和重叠输入和输出主题未提及HTTP API.
有没有人知道如何将HTTP API的队列连接到I/O完成端口?
我已经使用实现了一个目录遍历算法用于在Windows Shell IShellItem,IShellFolder,IStorage,IStream,等一切都很好.我甚至可以在shell命名空间扩展(例如.zip)文件中进行操作.
但是,当某些其他具有独占访问权限的程序使用文件时,我在提取(常规)文件大小时遇到问题.
AFAIK,只有STATSTG结构提供了比文件名更多的信息.基本上有3种方法来获取STATSTGa IShellItem:
IEnumSTATSTG而不是IEnumIDList.而不是调用IShellFolder::EnumObjects(),获取IStorage文件夹并调用IStorage::EnumElements().你现在STATSTG直接获得结构.IStorage了IShellItem与调用IStorage::Stat().IStream了IShellItem与调用IStream::Stat().我真的很想使用#1,因为它会给我所需的所有信息.但是,我无法枚举文件夹内容.我成功提取了IStorage文件夹:它自己Stat()给了我正确的文件夹名称.我成功提取了IEnumSTATSTG,但第一次调用Next(1, &item, NULL)返回S_FALSE并终止枚举.
我会回退使用#2,因为它仍然没有那么糟糕,但提取IStorage常规磁盘文件会产生使用IShellItem::BindToHandler(0, BHID_Storage, ...)和的错误IShellFolder::BindToStorage(child, ...).
我终于尝试了#3,虽然它只是平原似乎错了,只要文件没有被其他程序独占访问使用它就会成功.
我已经google了一下,发现了几个使用方法#3的代码片段.
问题:任何人都可以解释如何在STATSTG不使用方法#3 的情况下获取文件吗?
方法#1应该工作,还是IStorage常规文件夹的实现根本不生成列表?方法#2应该工作还是实际上 …
文档AcceptEx()说:
成功完成此操作后,可以传递sAcceptSocket,但仅传递给以下函数:
- ReadFile的
- WriteFile的
- 发送
- WSASend
- 的recv
- 的WSARecv
- 的TransmitFile
- 关闭套接字
- setsockopt(仅适用于SO_UPDATE_ACCEPT_CONTEXT)
请注意,这shutdown()不在列表中.实际上,调用shutdown(sAcceptSocket, SD_SEND)返回SOCKET_ERROR并WSAGetLastError()产生错误WSAENOTCONN:
不允许发送或接收数据的请求,因为套接字未连接(当使用sendto调用在数据报套接字上发送时)没有提供地址.
为什么不关闭通过连接的套接字AcceptEx()?另外,为什么套接字没有显示为已连接,因为它已经在接收数据(重叠操作已完成且完成通知表明size>0已收到一些字节)?