Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >NSPasteboard是线程安全的吗?

NSPasteboard是线程安全的吗?
EN

Stack Overflow用户
提问于 2010-05-08 21:57:22
回答 2查看 694关注 0票数 2

从后台线程向NSPasteboard对象写入数据是否安全?我似乎在任何地方都找不到明确的答案。我认为假设数据将在拖动开始之前写入粘贴板。

背景:

我有一个从Evernote获取数据的应用程序。当应用程序第一次加载时,它获取每个笔记的元数据,但不获取笔记内容。然后在大纲视图中列出注释存根。当用户开始拖动笔记时,笔记将被传递到后台线程,该线程负责从Evernote获取笔记内容。让主线程阻塞直到获得数据会导致显著的延迟和糟糕的用户体验,因此我让[outlineView:writeItems:toPasteboard:]函数在后台线程处理数据并调用主线程将数据写入粘贴板对象时返回YES。如果笔记内容在用户将笔记放到某个位置之前被传输,则一切工作正常。如果用户在处理数据之前将笔记放在某个地方...好吧,所有的东西都会永远阻塞。仅仅让后台线程将数据写入粘贴板是否安全?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-09 01:06:50

您可以将数据承诺到粘贴板,而不需要实际拥有数据。

一种方法是在粘贴板上声明数据的类型,将您自己作为粘贴板的所有者,并通过提供数据来响应a pasteboard:provideDataForType: message (如果需要,阻塞,直到数据到达或未能到达)。这意味着您需要记住复制了哪些对象(例如,通过将它们存储在数组中),以便在承诺到期时可以从中提取/生成数据。

Harald Scheirich的答案中提到的另一种方法是使您的模型对象符合the NSPasteboardWriting protocol,理想情况下是在一个类别中(将接口独立逻辑与Mac特定逻辑分开)。这比以前的方法干净得多,但需要MacOSX10.6和更高版本。

使用NSPasteboardWriting,您将通过让模型对象的writingOptionsForType:pasteboard: method返回the NSPasteboardWritingPromised option来实现promises。他们的 pasteboardPropertyListForType: method将返回数据,或者至少尝试-像以前一样,这个方法应该阻塞,直到数据到达或无法到达。

哦,为了回答标题中的问题(“NSPasteboard线程安全吗?”):Thread Safety Summary中没有具体的答案,但有这样的通用声明:

…可变对象通常不是线程安全的。要在线程化应用程序中使用可变对象,应用程序必须进行适当的同步。

我认为NSPasteboard是一个可变对象,所以不是。

在实践中,这不是问题:您通常只在响应操作消息(例如,copy:)、拖动或服务调用时才使用NSPasteboard,而且这些操作都只发生在主线程上。为了让它们发生在辅助线程上,您必须自己显式地从在辅助线程上运行的代码中发送此类消息,在这种情况下,您已经在做一些非常错误的事情了。

票数 6
EN

Stack Overflow用户

发布于 2010-05-08 23:08:14

猜想:

我认为您的问题与线程无关,而是通过返回YES告诉系统数据已准备好的事实。您是否尝试过将数据移动到支持NSPasteboardWritingNSPasteboardReading的自定义类中?这样,数据访问者就可以阻塞数据,直到数据准备就绪。

请参阅Pasteboard Documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2795798

复制
相关文章
使用 AForge.NET 做视频采集
AForge.NET 是基于C#设计的,在计算机视觉和人工智能方向拥有很强大功能的框架。btw... it's an open source framework. 附上官网地址: http://www.aforgenet.com/aforge/framework/ 。 今天要介绍的是AForge中的视频采集功能,这里的视频包括从摄像头等设备的输入和从视频文件的输入。 首先来认识一下 视频源播放器:VideoSourcePlayer,从摄像头和文件输入的视频,都会通过它来播放,并按帧(Frame)来输出Bit
Shao Meng
2018/04/28
2.1K0
在 WPF 中实现融合效果
融合效果是指对两个接近的元素进行高斯模糊后再提高对比度,使它们看上去“粘”在一起。在之前的一篇文章中,我使用 Win2D 实现了融合效果,效果如下:
dino.c
2022/10/05
1.3K0
在 WPF 中实现融合效果
WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项。不过,通常更有实际价值的是更复杂的 UWP 控件的引入,通常是一整个 Page。
walterlv
2020/02/10
5.9K0
在 WPF 中使用 x:Reference
发布于 2018-10-13 22:24 更新于 2018-12-14 01:54
walterlv
2020/02/10
1.5K0
WPF 在 DrawingContext 的 push 如何使用
如果在一个 DrawingContext 画出一个 DrawingVisual ,如何修改这个 DrawingVisual 的大小,对他进行变换?
林德熙
2022/08/04
4450
WPF 在 DrawingContext 的 push 如何使用
如果在一个 DrawingContext 画出一个 DrawingVisual ,如何修改这个 DrawingVisual 的大小,对他进行变换?
林德熙
2018/09/18
1.7K0
在.NET Core 3.0中的WPF中使用IOC图文教程
我们都知道.NET Core 3.0已经发布了第六个预览版,我们也知道.NET Core 3.0现在已经支持创建WPF项目了,刚好今天在写一个代码生成器的客户端的时候用到了WPF,所以就把WPF创建以及使用IOC的过程记录一下,希望能对大家有所帮助。当然文章实例我就以我曾阅读过的一篇文章的示例代码来进行演示了。
依乐祝
2019/07/03
8680
在.NET Core 3.0中的WPF中使用IOC图文教程
WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
发布于 2018-10-13 21:38 更新于 2018-10-14 04:25
walterlv
2020/02/10
3.1K0
在WPF桌面程序中使用ECharts展示图表
在WPF桌面系统需要实现仪表盘(dashboard是商业智能仪表盘(business intelligence dashboard,BI dashboard)的简称,它是一般商业智能都拥有的实现数据可视化的模块,是向企业展示度量信息和关键业务指标(KPI)现状的数据虚拟化工具。)形式的图表展示功能,研究了WPF开源的各个图件库,一般实现代码都比较复杂,灵活性不够,展示图表效果也不尽人意。后来想到ECharts,Echarts (ECharts)是百度公司出品的,算是百度不可多得的良心之作,使用方便灵活,而且
程序你好
2018/07/20
3.1K0
在 WPF 程序中应用 Windows 10 真•亚克力效果
从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了。不过相比于 UWP 来说,可定制性会差很多。
walterlv
2023/10/22
5520
在 WPF 程序中应用 Windows 10 真•亚克力效果
学习WPF——了解WPF中的XAML
XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象 XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素 了解XAML VisualStudio创建一个窗口,默认情况下产生的代码如下: 这段代码中包含两个标记元素,一个是Window,一个是Grid Window是WPF顶级元素的一种,还有另外两种顶级元素Page和App
liulun
2018/01/12
2K0
解决WPF在XP上使用微软雅黑字体
WPF项目,全局设置的微软雅黑,但是XP上没有这个字体,默认显示的是宋体。开始的思路是WPF可以将字体作为资源,在程序中使用,但是微软雅黑有两个文件,mysh, TTF和myshbd,TTF,单独加载
kiki.
2022/09/29
1K0
使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架
随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用。通过此方式可以辅助在现有的 WPF 项目里面,部分功能迁入 Uno 项目,或者是某些新开发功能通过 Uno 实现,从而利用 Uno 跨平台的能力,逐个功能点支持跨平台功能。逐个小功能接入的方式,让开发者不需要为一次性迁移一个庞大的项目而烦恼
林德熙
2023/04/07
6280
WPF Visifire使用
1.Visifire的创建需要引用的DLL包【WPFToolkit.dll;WPFVisifire.Charts;WPFVisifire.Gauges(这个以后会用到)】
全栈程序员站长
2022/09/13
4890
WPF Visifire使用
WPF使用URL协议实现网页中打开应用
网页唤起指定软件,其实就是利用URL来执行一个关键字Key,这个Key是注册表中的一个键,Value是指定路径的exe,亦可携带参数启动exe;
码客说
2022/10/28
1.1K0
WPF 使用 SharpDX
先介绍一下 SharpDx ,一个底层封装的 DirectX 库,支持 AnyCpu ,支持 Direct3D9, Direct3D11, Direct3D12,Direct2D1。支持 win32 程序和商店程序。
林德熙
2018/09/19
1.3K0
WPF 使用 SharpDX
WPF中的MatrixTransform
WPF中的MatrixTransform            周银辉 虽然在WPF中可以使用TranslateTransform、RotateTransform、ScaleTransform等进行
菩提树下的杨过
2018/01/22
1.4K0
WPF中的MatrixTransform
WPF中ListView排序
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
5160
WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
Windows Community Toolkit 再次更新到 5.0。以前可以在 WPF 中使用有限的 UWP 控件,而现在有了 WindowsXamlHost,则可以使用更多 UWP 原生控件了。
walterlv
2020/02/10
4.7K0
修改WPF中connectionString[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说修改WPF中connectionString[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
4440

相似问题

WPF使用AForge创建视频

12

在WPF应用程序上使用WebCam实现AForge.Net

48

C# WPF AForge :如何使视频平滑?

18

在AForge库中使用ImageProcessingLog

10

使用Aforge保存图像

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文