我正在更新关键部分内的窗口。因为在这个窗口内绘制的数据是由其他人(在另一个关键部分内)访问的,所以我想确保在我退出临界区时更新绘制的窗口。
在Windows中,我可以使用InvalidateRect
后跟UpdateWindow
来确保存在强制绘制并且执行消息而不是简单地将其推送到队列中,标记为稍后执行。
在OSX中实现相同效果的相应方法是什么?
从文档中可以看出:
[myWindow display]
其中myWindow
类型为NSWindow
应该可以做到,但它不会立即绘制它。
有什么建议吗?
答案 0 :(得分:2)
您可以通过在窗口中包含的视图上调用[self setNeedsDisplay]来强制它,然后在很短的时间内运行一个小的运行循环,以允许绘制消息传播到显示逻辑。
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true"/>
</configSections>
<connectionStrings>
<add name="ConStr" connectionString="Integrated Security=false;Persist Security Info=False;User ID=funny;password=veryfunny;Initial Catalog=vegimanager;Data Source=.\sqlexpress;"/>
</connectionStrings>
<connectionStrings>
这可能有用。这是一个相当奇怪的场景! YMMV。
答案 1 :(得分:1)
首先,你永远不会画进窗口。你绘制成视图。窗口只是视图的容器。
其次,视图应该知道自己,何时何地需要重新绘制。如果更改了底层数据,则报告该数据,但不报告绘图请求。这是因为控制器不能不,视图的哪个区域受到影响。
但是,毕竟我认为窗口更新请求是从另一个线程发送的。
使用GCD看起来像这样:
// Critical section ends here
dispatch_async( dispatch_get_main_queue(),
^{
[affectedView setNeedsDisplay];
});
使用线程
// Critical section ends here
[view performSelectorOnMainThread:@selector( setNeedsDisplay ) withObject:nil waitUntilDone:NO];