我有一系列工厂回归unique_ptr<Base>.引擎盖下,虽然,他们所提供的指针各种衍生类型,即unique_ptr<Derived>,unique_ptr<DerivedA>,unique_ptr<DerivedB>等
鉴于DerivedA : Derived并且Derived : Base我们有:
unique_ptr<Base> DerivedAFactory() {
return unique_ptr<Base>(new DerivedA);
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是将指针从返回"转换" unique_ptr<Base>到某个派生级别(不一定是原始的内部级别).用伪代码说明:
unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
Run Code Online (Sandbox Code Playgroud)
我正在考虑通过从中释放对象unique_ptr,然后使用一个转换原始指针的函数并将其重新分配给另一个unique_ptr所需的风格(release在调用之前由调用者显式完成)来实现这一点:
unique_ptr<Derived> CastToDerived(Base* obj) {
return unique_ptr<Derived>(static_cast<Derived*>(obj));
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,还是/会有什么时髦吗?
PS.还有一个复杂的问题是,有些工厂驻留在运行时动态加载的DLL中,这意味着我需要确保生成的对象在创建它们的同一个上下文(堆空间)中被销毁.所有权的转移(通常发生在另一个上下文中)必须从原始上下文中提供删除.但除了必须与指针一起提供/转换删除器之外,铸造问题应该是相同的.
场景:我正在使用Managed Extensibility Framework在运行时根据在单独的dll中定义的接口契约加载插件(导出).在我的Visual Studio解决方案中,我有3个不同的项目:主机应用程序,类库(定义接口 - "IPlugin")和另一个实现接口的类库(导出 - "MyPlugin.dll").
主机在其自己的根目录中查找导出,因此在测试期间,我构建整个解决方案并将Plugin.dll从Plugin类库bin/release文件夹复制到主机的调试目录,以便主机的DirectoryCatalog可以找到它并且能够将它添加到CompositionContainer.每次重建后都不会自动复制Plugin.dll,所以每次我对合同/实现进行更改时都会手动执行.
但是,有几次我运行主机应用程序而没有首先复制(更新)Plugin.dll,并且它在组合期间抛出异常:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information
这当然是因为它试图导入的Plugin.dll实现了不同版本的IPlugin,其中属性/方法签名不匹配.虽然在受控和受监控的环境中很容易避免这种情况,但通过简单地避免(duh)插件文件夹中过时的IPlugin实现,我不能依赖于可能遇到传统插件的生产环境中的这种假设.
问题是这个异常有效地破坏了整个Compose操作,并且没有导入导出.我宁愿忽略不匹配的IPlugin实现,因此仍会导入实现正确版本的IPlugin的目录中的其他导出.
有没有办法实现这个目标?我在想几种可能的选择:
<ImportMany()>属性上指定了类似的标志想法?
Apple的iOS开发人员指南声明:
3.3.2 - 应用程序本身不能通过任何方式安装或启动其他可执行代码,包括但不限于使用插件体系结构,调用其他框架,其他API或其他方式.除了由Apple的Documented API和内置解释器解释和运行的代码之外,不得在应用程序中下载或使用解释代码.
假设允许在运行时下载数据(例如XML和图像,或游戏级别描述)(就像我的印象一样?),我想知道他们在"数据"和"代码"之间划线.描绘为用户提供交互式"演示"的应用程序的场景(例如,调查).演示文稿不断添加到服务器,不同的演示文稿可供不同的用户使用,因此它们不能成为初始应用程序下载的一部分(这将是重点).它们以XML格式描述,但是它们是交互式的,它们可能包含这种条件分支(以伪形式显示以举例说明):
<options id="Gender">
<option value="1">Male</option>
<option value="2">Female</option>
</options>
<branches id="Gender">
<branch value="1">
<image src="Man" />
</branch>
<branch value="2">
<image src="Woman" />
</branch>
</branches>
Run Code Online (Sandbox Code Playgroud)
当在应用程序中解释和"播放"此XML时,上述步骤将分两步呈现.首先显示选择屏幕,其中用户可以点击两个选项中的任何一个("男性"或"女性").接下来,将[动态下载]图像并根据上一步骤中的选择进行显示.
现在,从中可以很容易地想象出其他标签,仍然可以进一步描述逻辑.例如,可以添加包含标记:
<loop count="3">
<options... />
<branches... />
</loop>
Run Code Online (Sandbox Code Playgroud)
结果是,当然,选择屏幕/图像屏幕对将顺序呈现三次.
或者想象一下描述游戏中某个关卡的格式.将自然视为被动"数据"也许很自然,但如果它包括,例如,用户可以通过的几个门道以及附加到它们的各种触发器,陷阱和点等等 - 与使用脚本(或实际上是解释代码) - 描述执行顺序,选项及其条件响应?
假设数据的解释引擎已经存在于应用程序中并且此类"演示文稿"只能在应用程序中使用(不创建或编辑),那么这将如何影响Apple的iOS指南呢?在这种意义上,XML基本上不构成脚本语言(解释性语言中的任何程序都不能用XML描述)吗?
如果专有的脚本语言(参考上面使用的XML)是严格的沙箱(他们怎么能告诉?)并且没有以任何方式访问操作系统(但能够下载内容 - 如调查或游戏),这样可以吗?级别 - 动态以及上传结果 - 答案或分数 - 到创作服务器)?
线路在哪里?
令我很生气的是,在Windows中调整窗口的大小并不像我希望的那样"平滑"(Windows程序通常就是这种情况,而不仅仅是我自己的.Visual Studio就是一个很好的例子).它使操作系统及其程序感觉"脆弱"和"便宜"(是的,我关心程序和用户界面的感觉,就像我关心关闭车门的声音和感觉一样.这是构建的反映质量),在我看来影响整体用户体验,最终影响品牌的感知.
重新调整大小时,重新绘制窗口内容无法跟上鼠标移动的步伐.每当我调整窗口大小时,都会出现"口吃"/"闪烁"效果,这似乎是由于在绘制新的已调整大小的内容之前,在新的已调整大小的窗口框架中重绘了窗口的先前大小内容.
我正在构建一个使用Direct2D 1.1绘制UI的Win32应用程序(x64),并且考虑到Direct2D的速度,我认为在2014年操作系统中不应该有这样的工件.我自己在Windows 8.1上,但是目标是Windows 7及以上版本的应用程序.
当最大化小窗口时,"先前大小"效果尤其明显(因为窗口大小的差异足以容易地对比旧内容的图像,因为它在较大窗口的左上角短暂闪烁与新内容随后被涂在上面).
这似乎是正在发生的事情:
我想知道是否有任何方法可以缓解这种情况(即摆脱第4步) - 例如通过拦截Windows消息 - 并避免在最终重新呈现之前使用旧内容重新绘制新大小的窗口新内容发生了.这就像Windows窗口重绘自己,使用已有的任何图形,之前很难要求我提供WM_PAINT消息或类似的更新内容.
可以吗?
编辑:似乎 WM_WINDOWPOSCHANGING/WM_SIZING 提供了对新大小数据的"早期访问",但我仍然没有设法抑制旧内容的绘制.
我WndProc看起来像这样:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_ERASEBKGND:
return 1;
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
D2DRender();
EndPaint(hWnd, &ps);
return 0;
case WM_SIZE:
if (DeviceContext && wParam != SIZE_MINIMIZED)
{
D2DResizeTargetBitmap();
D2DRender();
}
return 0;
case WM_DISPLAYCHANGE:
D2DRender(); …Run Code Online (Sandbox Code Playgroud) 我正在使用SSE内在函数来确定矩形(由四个int32值定义)是否已更改:
__m128i oldRect; // contains old left, top, right, bottom packed to 128 bits
__m128i newRect; // contains new left, top, right, bottom packed to 128 bits
__m128i xor = _mm_xor_si128(oldRect, newRect);
Run Code Online (Sandbox Code Playgroud)
此时,xor如果矩形未更改,则结果值将全为零.那么最有效的方法是什么呢?
目前我这样做:
if (xor.m128i_u64[0] | xor.m128i_u64[1])
{
// rectangle changed
}
Run Code Online (Sandbox Code Playgroud)
但我认为有一种更聪明的方法(可能使用了一些我还没有找到的SSE指令).
我在x64上定位SSE4.1,我在Visual Studio 2013中编写C++.
我正在构建一个Win7/8/10 x64 Direct3D11桌面应用程序,允许用户在窗口模式和全屏模式之间切换(适当的专用全屏模式,而不仅仅是最大化的窗口*).在双显示器设置上,我遇到了一些问题.
交换机本身是手动执行的IDXGISwapChain::SetFullscreenState,并按预期工作:占据窗口区域狮子的显示器(让我们称之为监视器A)进入专用全屏模式,而另一个(监视器B)保持原样,允许用户与B上的窗口以及A上的全屏应用程序正常交互.
但是,如果拖动或调整B上的窗口使其跨越到A,则应用程序的全屏状态会受到干扰:有时它只会恢复到窗口模式(使应用程序的内部跟踪变量不同步),有时会保持不变准全屏模式,它似乎拒绝进一步的模式切换,等等.如果在应用程序进入全屏模式之前与A和B重叠的窗口获得焦点,则会发生同样的情况.
有什么方法可以防止这种情况吗?
我希望操作系统能够尊重我的应用程序的专用全屏模式,并将其保持在稳健状态,即使其他窗口被拖动到该监视器上也是如此.我希望这种行为类似于拥有一个"永远在顶部,最大化的无边界窗口",即让其他窗口"消失在它后面"并且根本不影响我的全屏窗口的状态.
我已经尝试了一些解决方法,比如响应WM_KILLFOCUS并暂时将我的应用程序切换到"最大化无边界窗口",直到它WM_SETFOCUS再次收到,但是WM_KILLFOCUS消息有一个滞后期间,用户有时间将另一个窗口拖到当时的区域仍处于全屏模式,从而让我回到原点.
*我想要这个功能而不是简单地使用最大化的无边界窗口(也是支持模式,顺便说一句)的原因与它有关,允许更低的鼠标移动到渲染延迟,vsync控制(开/关)所有这些 - 简而言之 - 对于这个应用程序的性质(这不是游戏)很重要.
我有一个TraceSource对象,我用它来记录VB.Net应用程序的初始化.它附加了几个TraceListeners:
对于前两个,我希望输入输出为"原始" - 即没有标准头:
SourceName TraceEventType: Id :
我已经实现了一个包装器,当TraceEventType设置为Verbose时执行此操作:
If _buffer.EventType = TraceEventType.Verbose Then
For Each listener As TraceListener In _traceSource.Listeners
listener.Write(_buffer.Text)
Next
Else
_traceSource.TraceEvent(_buffer.EventType, id, _buffer.Text)
End If
Run Code Online (Sandbox Code Playgroud)
我可以为所有跟踪执行此操作,但然后EventLog中的所有条目都将列出Level = Information.所以我希望能够指定跟踪消息的严重性,但我无法在TraceSource或TraceListeners上找到允许我这样做的任何方法.据我所知,TraceListener有这些选项可以写入它:
最后3个允许提供TraceEventType(正确标记EventLog条目,但结果输出到控制台,然后日志文件包含前缀,并以此结束(例如):
Bootstrapper Warning: 0 : Failed to validate assembly
有没有办法覆盖ConsoleTraceListener和TextWriterTraceListener如何格式化其输出以不包含此标头,同时能够使用TraceEventType标记条目(对于EventLog)?
这是迄今为止我提出的最好的:
For Each listener As TraceListener In _traceSource.Listeners
If listener.GetType Is GetType(ConsoleTraceListener) OrElse listener.GetType Is GetType(TextWriterTraceListener) Then
listener.Write(_buffer.Text)
Else
listener.TraceEvent(Nothing, _traceSource.Name, _buffer.EventType, id, _buffer.Text)
End If
Next
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但在Microsoft …
我正在WPF中构建一个自定义UI框架,在这里我基本上放弃了尽可能多的内置布局系统和控件。到目前为止,我一直没有UIElement直接涉足,但是由于我已经在进行测量,整理和渲染自己,所以我认为我可以通过甚至“更接近金属”来减少WPF的更多遗产(尤其是当它来的时候)进行布局/渲染)。在保持托管代码的同时又不害怕自己做肮脏的工作的情况下,有多接近?
我现在正在一边玩一个原型概念,在这个概念中,我只有一个元素继承自UIElement:一个Root类似于剥离的对象Canvas,它“托管”了我的其余布局引擎,并将相关的IInputElement利益引入其中。从那时起,所有元素将完全是自定义对象,而不是从WPF中的任何内容继承而来,而是直接呈现到DrawingContextRoot中(在其OnRender方法中)。
现在,我想知道拥有WriteableBitmap根元素并手动使用它的相对性能,例如,为了方便起见,使用WriteableBitmapEx。没有抗锯齿不是问题,定制命中测试系统也不是问题。
我的想法主要是WriteableBitmap(Ex)不具有任何GPU加速增益的特权,因此,当需要重绘/变换大面积区域时,WriteableBitmap(Ex)的速度将大大降低。
但是,对于“基于像素的渲染引擎”,我确实还有其他需求,因此我仍然对此感兴趣。
有什么见解吗?
编辑:在这种情况下,SharpDX呢?也许曾经的我在这我还不如去与一个DirectX包装像SharpDX一个WinForms的解决方案(..或..我想我真正应该做的是注册了整个C ++安吉拉卷,但不幸的是我没有有时间开始学习这些东西。..
我正在构建一个Windows(服务)应用程序,简而言之,它包含一个"引导程序"和一个"引擎"(由引导程序加载的对象,它将控制转移给它,然后执行应用程序的实际任务).引导程序是一个非常基本的启动例程,几乎没有可能更改的功能.但是安装后引擎本身可能会升级,我正在实现一种机制,以便它可以自行升级 - 通过联系"主服务器"并检查其版本号与"最新"版本.如果有更新版本的引擎可用,它会将其下载到指定的文件夹中并调用引导程序中的方法以"重新启动".
因此,每当引导程序启动时,它都会使用MEF"扫描"适当的目录以实现IEngine,比较它们的引导程序兼容性数字并选择最新的兼容引擎版本.然后它将控制转移到引擎(然后,然后执行更新检查等).如果没有合格的IEngine - 或者MEF在组合期间失败 - 它会回到IEngine的默认内置实现中.
此应用程序将在远程服务器(或多个)上运行,其背后的全部原理是将手动应用程序维护保持在最低限度(如不必卸载/下载新版本/重新安装等).
所以,问题是:由于引导程序有效地将程序执行转移到IEngine对象上的方法,因此以某种方式找到应用程序扫描文件夹的恶意IEngine实现(或模仿器)基本上会在服务器加载时造成严重破坏并被发现是最符合条件的引擎版本.
我正在寻找一种机制来验证IEngine实现是否"真实" - 正如由适当的权威机构发布的那样.我一直在玩一些家庭brewn"解决方案"(IEngine暴露了一个传递"挑战"的Validate函数,并且必须以各种方式返回正确的"响应" - 比如让引导程序产生随机字符串加密并传递给引擎候选者,后者必须解密并修改字符串,然后对其进行哈希处理,加密哈希并将其返回给引导程序,后者将对其随机字符串执行类似的字符串修改,然后对其进行哈希并比较哈希到候选等的解密响应(哈希),但我确定.Net中有功能来执行这种验证?我只看了强命名,
输入将不胜感激.
我想我有类似"程序员的强迫症"的东西.我喜欢我的代码是美观和干净的,我希望它是"完美的"(正如在处理所有可能的情况时那样正确和漂亮).我经常发现自己花了很多时间一次又一次地走过同一个地方,看看我可以在哪里进行优化以及哪些方面可以做到万无一失.
因此,当涉及到尝试......捕获块时,我会对所包含的内容感到一些偏执.我的意思是,我在哪里绘制代码应该满足的代码?例如,进行文件处理.我应该把一个该死的文件操作放在一个try ... catch块中,万一有些事情可能发生(文件被应用程序外部某人/某些东西锁定,磁盘损坏等)?
有时它会让我的大脑感觉到可能有些东西(我甚至都不知道)可能会绊倒一些代码.
编辑:
我不是在谈论使用try ... catch来涵盖糟糕的编程,我在谈论操作和程序,否则实现得当,但依赖于我无法控制的其他因素 - 即使它们可能是模糊不清(这就是重点),只有在我没有预料到的极其"不幸"的情况下才会发生.
文件处理是一个明显的例子.当我倾向于让人感到紧张时,我就想知道在其他内置功能的幕后进行什么样的处理,以及它如何响应我的代码.
这是一个例子:
Dim serverUrl as String = My.Settings.ServerUrl
Run Code Online (Sandbox Code Playgroud)
那里有一个磁盘操作(从app.config读取).如果是在一个try ... catch块封闭?这就是我的意思,它在哪里结束.
害怕内存泄漏是另一回事.是否只有非托管代码才会构成威胁?我怎么知道什么是非托管代码?有清单吗?
更多编辑:
另一个我感到不自信的领域是在引擎盖下的某些地方有访问限制或政策.
当我阅读关于编程的文章和讨论时,我看到了很多解释,"好吧,你的问题是当你打电话给X时,.Net在内部试图访问某某,除非你的应用程序在上下文类型Y中运行,或者您具有权限Z,它将引发异常".这只会增加我的偏执 - 当涉及到建立防水异常处理时.因为我根本不知道语言/平台的所有内部运作,并且不知道在哪里看(不必花费我的生命来研究它).
我很乐意为此专门制作某种形式的纲要或简明的维基,这将概述需要特别关注的编程领域(文件处理等),示例场景,典型挑战和罪魁祸首(使用解决方案),最佳实践模型,编程模式,并且至少为像我这样的凡人提供了一套指导方针,遗憾的是,它并没有参与实际构建语言及其库.
所有这一切都在一个地方,而不是必须在语言参考或网上的随机文章中追踪分散的信息 - 在许多情况下我甚至不知道该寻找什么.
至于我当前的特定项目,它是在Windows服务的上下文中.没有UI,我正在研究的一个子任务是创建一个健壮的引导程序,可以优雅地处理所有问题场景.在这种情况下,所有关于日志记录 - 然后要么忽略异常(如果它足够微不足道) - 或者只是退出!如果在尝试登录时发生问题 - 那我该怎么办?刚退出 - 没有发生什么事情的痕迹?这个引导程序只记录它的启动(之后,主程序集 - 它是动态加载的 - 接管并记录它自己的东西,尽管有相同的挑战),并且这样做是为了一个简单的"bootstrap.log"文件.将它登录到EventLog会更好(或有价值的补充)吗?或者EventLog是另一个可能产生新问题世界的区域(同样,访问限制等等.事件日志是否也基于需要"尝试和捕获"的磁盘操作......?)
看到?偏执狂.
假设我想创建一个直接继承的类,UIElement并且能够包含一个或多个[外部添加] UIElement作为子项 - 比如Panels和其他容器控件.很容易让班级UIElement以某种形式或其他形式收集s,但我如何让它们与我的班级一起展示/呈现?
我认为必须将它们添加到可视化树为我自己的孩子,UIElement以某种方式(或可能的话,手动使他们通过LA去VisualTreeHelper.GetDrawing,并用做OnRender的DrawingContext?但似乎笨拙).
我不是想知道我可以-或者应该-从多个现成的控制,继承一样FrameworkElement,Panel,ContentControl等(如果有的话,我想知道如何,他们正在实施外部添加子元素的显示/渲染,如适用) .
我有理由希望在层次结构中尽可能高,所以请不要给我任何关于为什么XAML/WPF框架"合规"等是好事的讲座等.
什么是最佳实践(在VB.Net中):
Function GetSomething() as String
GetSomething = "Here's your string"
End Function
Run Code Online (Sandbox Code Playgroud)
要么
Function GetSomething() as String
Dim returnString as String = "Here's your string"
Return returnString
End Function
Run Code Online (Sandbox Code Playgroud)
显然,这些实现都没有任何意义,但它们只是为了说明我的观点.有没有什么可以通过使用GetSomething自己来存储返回值而不是在returnString本地声明然后返回它(它是否避免分配/实例化额外的字符串 - 如果是这样,是否有任何性能/内存优势)?
我只是在测试一个我在项目中使用的量化器类,并模拟一个相对精细的数字范围(对于要量化为离散步骤的类),我使用Double作为For ... Next循环递增值.像这样:
For d As Double = 0 To 1 Step 0.01
' logic here
Next
Run Code Online (Sandbox Code Playgroud)
结果不是我对量化器所期望的结果,并且在试图弄清楚量化逻辑错误的地方时,我摸不着头脑.最后,我简单地转储了循环产生的数字,几乎只是为了它的地狱.令我惊讶的是,上面的循环没有以0.01的精确步长产生一系列数字.
这是我使用的循环:
For d As Double = 0 To 1 Step 0.01
Me.TextBox1.AppendText(d.ToString & vbCrLf)
Next
Run Code Online (Sandbox Code Playgroud)
这是它打印的数字列表:
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
0.11
0.12
0.13
0.14
0.15
0.16
0.17
0.18
0.19
0.2
0.21
0.22
0.23
0.24
0.25
0.26
0.27
0.28
0.29
0.3
0.31
0.32
0.33
0.34
0.35
0.36
0.37
0.38
0.39
0.4
0.41
0.42
0.43
0.44
0.45 …Run Code Online (Sandbox Code Playgroud) c++ ×4
.net ×2
c# ×2
mef ×2
vb.net ×2
winapi ×2
wpf ×2
app-store ×1
c++11 ×1
components ×1
direct2d ×1
direct3d11 ×1
dll ×1
exception ×1
fullscreen ×1
integer ×1
intrinsics ×1
ios ×1
iphone ×1
listener ×1
loader ×1
logging ×1
paint ×1
plugins ×1
rendering ×1
security ×1
simd ×1
sse ×1
trace ×1
try-catch ×1
uielement ×1
unique-ptr ×1
windows ×1