我有一个NSRunLoop对象,我附加了定时器和流.它很棒.停止它是另一个故事.
我使用循环运行[runLoop run].
如果我尝试停止循环使用CRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]),循环将不会停止.如果我使用CRunLoopRun()相反的方式启动循环,它可以工作.我还确保调用是在正确的线程(运行我的自定义运行循环的线程)上进行的.我调试了这个pthread_self().
我找到了一个邮件列表存档,开发人员说" CRunLoopStop()如果使用run方法启动循环,就不要使用NSRunLoop".我可以理解为什么它是这样的 - 你通常将初始化器和终结器配对来自同一组函数.
如何在NSRunLoop没有"诉诸CF" 的情况下停止?我没有看到stop方法NSRunLoop.文档说你可以通过三种方式停止运行循环:
CFRunLoopStop()好吧,我已经尝试过2.并且有一种"丑陋"的感觉,因为你必须深入研究CF. 3.不可能 - 我不喜欢非确定性代码.
这给我们留下了1.如果我理解正确的文档,你不能"添加"超时已经存在的运行循环.您只能在超时时运行新的运行循环.如果我运行一个新的运行循环,它将无法解决我的问题,因为它只会创建一个嵌套的运行循环.我仍然会回到原来的那个,同样我想停止......对吧?我可能误解了这个.另外,我不想使用超时值运行循环.如果我这样做,我将不得不在刻录CPU周期(低超时值)和响应性(高超时值)之间进行权衡.
这是我现在的设置(伪代码):
Communicator.h
@interface Communicator : NSObject {
NSThread* commThread;
}
-(void) start;
-(void) stop;
@end
Run Code Online (Sandbox Code Playgroud)
Communicator.m
@interface Communicator (private)
-(void) threadLoop:(id) argument;
-(void) stopThread;
@end
@implementation Communicator
-(void) start {
thread = [[NSThread alloc] initWithTarget:self
selector:@selector(threadLoop:)
object:nil];
[thread start];
}
-(void) stop …Run Code Online (Sandbox Code Playgroud) 我有一个COM服务器(C++/STA(基于MFC的应用程序))和一个COM客户端(C#/ MTA).COM服务器必须位于STA中,因为它是一个MFC应用程序(在这个问题上我别无选择).客户端向服务器发出调用,服务器向客户端发出回调.这就是错误发生的地方(RPC_E_CANTCALLOUT_ININPUTSYNCCALL).我猜测服务器是否是MTA,这个问题永远不会出现,但遗憾的是,MFC的文档明确否认将公寓初始化为MTA.
关于如何解决这个问题的任何想法?
我一直在想让服务器对象(我通过运行对象表公开的对象)住在自己的公寓(MTA)中.这是一个好主意,还是先尝试一些简单的东西?
UPDATE
服务器对象只是指向应用程序中某些功能的精简界面.大多数情况下,它只是读取和写入内存位置,但有些情况下它会向应用程序中的各个窗口生成窗口消息.服务器对象本身不是整个应用程序.
(问题在最后)
我正在对第三方COM组件产生严重的头痛,这些组件不断更改FPU控制字.
我的开发环境是Windows和Visual C++ 2008.普通的FPU控制字指定在各种条件下不应抛出任何异常.我已经通过查看中_CW_DEFAULT找到的宏float.h以及在启动时查看调试器中的控制字来验证这一点.
每次我调用COM对象时,控制字在返回时被修改.这很容易防御.我只是重置控制字,一切都很好.问题是当COM组件开始调用我的事件接收器时.我可以在收到事件调用后立即通过重置控制字来保护我的代码,但是一旦从事件调用返回,我就无法做任何事情.
我没有此COM组件的源代码,但我与作者联系.我从他那里得到的回答是"嗯?".我不认为他对我正在谈论的内容有任何线索,所以我担心自己必须对此做些什么.我相信他的运行时(我认为它是Delphi或Borland C++,因为DLL中充满了符号名称,都以大写字母T开头),或者他正在使用的其他一些第三方代码,这导致了问题.我不认为他的代码明确地修改了FPU控制字.
那么,我该怎么办?从业务角度来看,必须使用此第三方组件.从技术角度来看,我可以抛弃它,并自己实现通信协议.然而,这将是非常昂贵的,因为该协议涉及处理信用卡交易.我们不想承担责任.
我迫切需要一个关于Borland产品中FPU设置的黑客或一些有用的信息,我可以传递给组件的作者.
有什么我能做的吗?我不认为组件作者有什么需要解决它(通过他的相当无知的回答判断).
我一直在想着安装自己的异常处理程序,我只是在处理程序中重置控制字,并告诉Windows继续执行.我试过安装处理程序SetUnhandledExceptionFilter(),但由于某种原因,没有捕获异常.
我想感谢大家的建议.我已经向作者发送了关于他可以做些什么的说明,以便让我的生活变得更轻松,而不仅仅是我的代码的许多其他客户.我向他建议他应该对FPU控制字进行采样DllMain(DLL_PROCESS_ATTACH),并保存控制字以供日后使用,这样他就可以在调用我的事件处理程序之前重置FPU CW,并从我的调用中返回.
就目前而言,如果有人有兴趣,我会有一个黑客攻击.黑客攻击可能是一个糟糕的,因为我不知道它对他的代码会做什么.我之前收到的确认是他在代码中没有使用任何浮点数,所以这应该是安全的,除非他使用的某些第三方代码依赖于FPU异常.
我对我的应用程序进行的两项修改:
WH_CALLWNDPROC)以捕获绕过消息泵的转角情况在这两种情况下,我都会检查FPU CW是否已更改.如果有,我将其重置为_CW_DEFAULT.
假设我们class X在程序集的版本1中A.dll:
class X {
SomeType Property { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
然后在程序集的第2版中A.dll:
class X {
SomeType Property { set; get; }
SomeType OtherProperty { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
现在假设我们有第二个B.dll加载A.dll和使用X的程序集.是否会添加属性会OtherProperty破坏ABI?将B.dll无法使用A.dll/ X?如果没有,声明的顺序会有什么不同吗?如果属性是虚拟的,它有什么不同吗?
我想我真的在问:ABI的一般规则是什么?我知道在发布之后更改接口是一件坏事,但我真的希望能够在某些情况下添加属性,而无需添加子类.
所以我试图弄清楚它是如何工作的:C++ 11:我可以从多个args转到元组,但是我可以从元组转到多个args吗?
我不明白的黑魔法是这段代码片段:
f(std::get<N>(std::forward<Tuple>(t))...)
Run Code Online (Sandbox Code Playgroud)
这f是我不明白的内心表达.
我理解表达式以某种方式解压缩/扩展内部t的参数列表.但有人可以解释如何做到这一点?当我看到std::get(http://en.cppreference.com/w/cpp/utility/tuple/get)的定义时,我看不出有多N适合......?据我所知,N是一个整数序列.
根据我可以观察,我假设的形式表达E<X>...,其中X是类型的序列X1.X2,... Xn,表达式将扩展为E<X1>, E<X2> ... E<Xn>.这是怎么回事?
编辑:在这种情况下,N不是类型序列,而是整数.但我猜这种语言结构适用于类型和值.
我是Objective-C的新手,所以这可能是一个愚蠢的问题.
我不禁看到ObjC和微软的COM在内存管理方面的相似之处(AddRef/ Releasevs retain/ release).在COM环境中,在将对象返回给调用者之前,或多或少地强加给你始终AddRef(retain)一个对象.从我到目前为止看到的(我是Mac®OSX(第3版)的Cocoa®编程的第三部分),内存管理部分有些模糊.
假设没有GC,返回对象的惯用方法是什么?
是否可以模拟Windows Installer?我想在安装过程中为各种场景设置测试.我并不关心Windows Installer数据库中存储的内容,我只想测试安装程序包的输出(更改了哪些文件等).
编辑
我想我可以设置VMWare图像并编写脚本.有人知道如何在VMWare实例中编写脚本/自动化任务吗?
是否可以替换所选单元格的单元格视图?我已将我的控制器注册为数据源和委托.对单元格视图,行号,选择状态等的请求都很好.在单元格选择回调中,我试图让表格视图用新视图重新加载单元格(而不是实际数据!).基本上,我希望单元格视图展开并显示更多基础数据(如果已选中).问题是我不知道如何使表视图向我的控制器询问新视图.我可以看到视图正在请求单元格高度,但仅此而已.
在视图上调用reloadData可以正常工作,但它效率低下并且带有一系列自己的问题(动画可能性,维护选择状态等).
我目前正在使用Microsoft的并发运行时中的异步代理库.我还没有找到一种明显的方法来通过使用窗口消息或其他一些通知UI线程完成工作的方式来表示任务已完成.
我知道我可以将窗口句柄和消息值(WM_xxx)传递给任务,并让任务用于PostMessage()发出UI线程的信号.在我看来,这有点难看,也是错误的根源.如果发生异常,我必须有一个catch处理程序来指示我的UI线程.这很容易被遗忘,并且异常情况可能不会经常运行,因此很难发现它.
该文档讨论了如何将数据移回UI线程.它不使用窗口消息,而是使用轮询技术.当有"中断"方法可用时,我觉得设置定时器以查询任务是否完成是愚蠢的!
这有点奇怪,它没有内置到库中,因为它不是跨平台库.根据我的理解,它被设计为仅在Windows和Windows上运行.
库中是否有可用的功能,还是我必须手动滚动?
你如何模拟,$http以便在调用特定的URL时调用该.error函数?
beforeEach(angular.mock.inject(function ($httpBackend) {
$httpBackend.when('GET', '/ErrorReturningURL').respond(/* report a 404 */);
}));
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我将观察某个函数调用.
c++ ×2
com ×2
.net ×1
abi ×1
angularjs ×1
automation ×1
c# ×1
c++11 ×1
cfrunloop ×1
cocoa-touch ×1
components ×1
delphi ×1
foundation ×1
fpu ×1
ios ×1
jasmine ×1
macos ×1
mocking ×1
mta ×1
nsrunloop ×1
objective-c ×1
retain ×1
scripting ×1
sta ×1
templates ×1
testing ×1
uitableview ×1
visual-c++ ×1
vmware ×1
windows ×1