小编Jör*_*son的帖子

CFRunLoopRun()vs [NSRunLoop运行]

我有一个NSRunLoop对象,我附加了定时器和流.它很棒.停止它是另一个故事.

我使用循环运行[runLoop run].

如果我尝试停止循环使用CRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]),循环将不会停止.如果我使用CRunLoopRun()相反的方式启动循环,它可以工作.我还确保调用是在正确的线程(运行我的自定义运行循环的线程)上进行的.我调试了这个pthread_self().

我找到了一个邮件列表存档,开发人员说" CRunLoopStop()如果使用run方法启动循环,就不要使用NSRunLoop".我可以理解为什么它是这样的 - 你通常将初始化器和终结器配对来自同一组函数.

如何在NSRunLoop没有"诉诸CF" 的情况下停止?我没有看到stop方法NSRunLoop.文档说你可以通过三种方式停止运行循环:

  1. 配置运行循环以使用超时值运行
  2. 告诉运行循环停止使用 CFRunLoopStop()
  3. 删除所有输入源,但这是一种不可靠的方法来停止运行循环,因为你永远无法知道什么困在你背后的运行循环中

好吧,我已经尝试过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)

macos core-foundation foundation cfrunloop nsrunloop

15
推荐指数
1
解决办法
8001
查看次数

COM出站呼叫导致"由于应用程序正在调度输入同步呼叫,因此无法进行拨出呼叫."

我有一个COM服务器(C++/STA(基于MFC的应用程序))和一个COM客户端(C#/ MTA).COM服务器必须位于STA中,因为它是一个MFC应用程序(在这个问题上我别无选择).客户端向服务器发出调用,服务器向客户端发出回调.这就是错误发生的地方(RPC_E_CANTCALLOUT_ININPUTSYNCCALL).我猜测服务器是否是MTA,这个问题永远不会出现,但遗憾的是,MFC的文档明确否认将公寓初始化为MTA.

关于如何解决这个问题的任何想法?

我一直在想让服务器对象(我通过运行对象表公开的对象)住在自己的公寓(MTA)中.这是一个好主意,还是先尝试一些简单的东西?

UPDATE

服务器对象只是指向应用程序中某些功能的精简界面.大多数情况下,它只是读取和写入内存位置,但有些情况下它会向应用程序中的各个窗口生成窗口消息.服务器对象本身不是整个应用程序.

com mta sta visual-c++

10
推荐指数
1
解决办法
1万
查看次数

第三方代码正在修改FPU控制字

介绍 - 漫长而无聊的部分

(问题在最后)

我正在对第三方COM组件产生严重的头痛,这些组件不断更改FPU控制字.

我的开发环境是Windows和Visual C++ 2008.普通的FPU控制字指定在各种条件下不应抛出任何异常.我已经通过查看中_CW_DEFAULT找到的宏float.h以及在启动时查看调试器中的控制字来验证这一点.

每次我调用COM对象时,控制字在返回时被修改.这很容易防御.我只是重置控制字,一切都很好.问题是当COM组件开始调用我的事件接收器时.我可以在收到事件调用后立即通过重置控制字来保护我的代码,但是一旦从事件调用返回,我就无法做任何事情.

我没有此COM组件的源代码,但我与作者联系.我从他那里得到的回答是"嗯?".我不认为他对我正在谈论的内容有任何线索,所以我担心自己必须对此做些什么.我相信他的运行时(我认为它是Delphi或Borland C++,因为DLL中充满了符号名称,都以大写字母T开头),或者他正在使用的其他一些第三方代码,这导致了问题.我不认为他的代码明确地修改了FPU控制字.

那么,我该怎么办?从业务角度来看,必须使用此第三方组件.从技术角度来看,我可以抛弃它,并自己实现通信协议.然而,这将是非常昂贵的,因为该协议涉及处理信用卡交易.我们不想承担责任.

我迫切需要一个关于Borland产品中FPU设置的黑客或一些有用的信息,我可以传递给组件的作者.

问题

有什么能做的吗?我不认为组件作者有什么需要解决它(通过他的相当无知的回答判断).

我一直在想着安装自己的异常处理程序,我只是在处理程序中重置控制字,并告诉Windows继续执行.我试过安装处理程序SetUnhandledExceptionFilter(),但由于某种原因,没有捕获异常.

  1. 为什么我不抓住例外?
  2. 如果我成功捕获FPU异常,重置FPU控制字,只是让执行继续,因为没有发生任何事情 - 所有赌注都关闭了吗?

更新

我想感谢大家的建议.我已经向作者发送了关于他可以做些什么的说明,以便让我的生活变得更轻松,而不仅仅是我的代码的许多其他客户.我向他建议他应该对FPU控制字进行采样DllMain(DLL_PROCESS_ATTACH),并保存控制字以供日后使用,这样他就可以在调用我的事件处理程序之前重置FPU CW,并从我的调用中返回.

就目前而言,如果有人有兴趣,我会有一个黑客攻击.黑客攻击可能是一个糟糕的,因为我不知道它对他的代码会做什么.我之前收到的确认是他在代码中没有使用任何浮点数,所以这应该是安全的,除非他使用的某些第三方代码依赖于FPU异常.

我对我的应用程序进行的两项修改:

  1. 包裹我的消息泵
  2. 安装一个窗口挂钩(WH_CALLWNDPROC)以捕获绕过消息泵的转角情况

在这两种情况下,我都会检查FPU CW是否已更改.如果有,我将其重置为_CW_DEFAULT.

windows delphi com components fpu

10
推荐指数
2
解决办法
1803
查看次数

C#接口破坏,ABI

假设我们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的一般规则是什么?我知道在发布之后更改接口是一件坏事,但我真的希望能够在某些情况下添加属性,而无需添加子类.

.net c# abi binary-compatibility

9
推荐指数
2
解决办法
1830
查看次数

从元组中解压缩参数

所以我试图弄清楚它是如何工作的: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不是类型序列,而是整数.但我猜这种语言结构适用于类型和值.

c++ templates variadic-templates c++11

9
推荐指数
1
解决办法
4779
查看次数

保留/释放返回的对象

我是Objective-C的新手,所以这可能是一个愚蠢的问题.

我不禁看到ObjC和微软的COM在内存管理方面的相似之处(AddRef/ Releasevs retain/ release).在COM环境中,在将对象返回给调用者之前,或多或少地强加给你始终AddRef(retain)一个对象.从我到目前为止看到的(我是Mac®OSX(第3版)的Cocoa®编程的第三部分),内存管理部分有些模糊.

假设没有GC,返回对象的惯用方法是什么?

memory-management objective-c retain

6
推荐指数
2
解决办法
8496
查看次数

模拟Windows Installer

是否可以模拟Windows Installer?我想在安装过程中为各种场景设置测试.我并不关心Windows Installer数据库中存储的内容,我只想测试安装程序包的输出(更改了哪些文件等).

编辑

我想我可以设置VMWare图像并编写脚本.有人知道如何在VMWare实例中编写脚本/自动化任务吗?

testing scripting vmware automation windows-installer

6
推荐指数
1
解决办法
313
查看次数

UITableView,替换选择时的单元格视图

是否可以替换所选单元格的单元格视图?我已将我的控制器注册为数据源和委托.对单元格视图,行号,选择状态等的请求都很好.在单元格选择回调中,我试图让表格视图用新视图重新加载单元格(而不是实际数据!).基本上,我希望单元格视图展开并显示更多基础数据(如果已选中).问题是我不知道如何使表视图向我的控制器询问新视图.我可以看到视图正在请求单元格高度,但仅此而已.

在视图上调用reloadData可以正常工作,但它效率低下并且带有一系列自己的问题(动画可能性,维护选择状态等).

cocoa-touch uitableview ios

6
推荐指数
1
解决办法
6137
查看次数

异步代理和窗口消息

我目前正在使用Microsoft的并发运行时中的异步代理库.我还没有找到一种明显的方法来通过使用窗口消息或其他一些通知UI线程完成工作的方式来表示任务已完成.

我知道我可以将窗口句柄和消息值(WM_xxx)传递给任务,并让任务用于PostMessage()发出UI线程的信号.在我看来,这有点难看,也是错误的根源.如果发生异常,我必须有一个catch处理程序来指示我的UI线程.这很容易被遗忘,并且异常情况可能不会经常运行,因此很难发现它.

该文档讨论了如何将数据移回UI线程.它不使用窗口消息,而是使用轮询技术.当有"中断"方法可用时,我觉得设置定时器以查询任务是否完成是愚蠢的!

这有点奇怪,它没有内置到库中,因为它不是跨平台库.根据我的理解,它被设计为仅在Windows和Windows上运行.

库中是否有可用的功能,还是我必须手动滚动?

c++ visual-studio-2010 concurrency-runtime

5
推荐指数
1
解决办法
333
查看次数

你如何模拟$ http给404?

你如何模拟,$http以便在调用特定的URL时调用该.error函数?

beforeEach(angular.mock.inject(function ($httpBackend) {
    $httpBackend.when('GET', '/ErrorReturningURL').respond(/* report a 404 */);
}));
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我将观察某个函数调用.

mocking jasmine angularjs

5
推荐指数
1
解决办法
3295
查看次数