Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

长期运行程序中 ClipboardContext 实例的最佳使用方式 #50

Closed
doraemonkeys opened this issue Oct 13, 2024 · 2 comments
Closed
Labels
question Further information is requested

Comments

@doraemonkeys
Copy link

Topic | 话题

ClipboardContext

Discussion | 讨论

你好,

我正在开发一个需要长期在后台运行并频繁访问剪贴板的程序。关于 ClipboardContext 的使用,我有以下疑问:

对于长期运行的程序,是否应该每次需要访问剪贴板时都新建一个 ClipboardContext 实例?或者,是否更好的做法是在程序启动时创建一个 ClipboardContext 实例,并将其作为全局变量长期持有和重复使用?

能否提供一些最佳实践建议?如果根据不同的使用场景有不同的推荐做法,也请告诉我。

谢谢!

@ChurchTao
Copy link
Owner

ChurchTao commented Oct 14, 2024

@doraemonkeys
如果从rust层面的内存开销来说的话,我推荐是全局只使用同一个context对象。我对api的设计也是可以重复使用的。

如果从操作系统层面上来说,不同系统的剪贴板其实实现方式是不一样的,例如Windows中,同一时刻,只能有同一个线程持有剪贴板具柄,所以就算ClipboardContext一直存在,但是实际上具柄会在下一个线程请求的时候给到别的线程。所以这个开销你是跑不了的。

在MacOS中,倒是最贴合的,允许重复使用同一个内存对象。

在Linux中,所谓的剪贴板,其实程序告诉X11服务器:“我这边提供一个文本可供其他程序读取”,所以当“我”这个线程结束的时候,我提供的内存,自然就不存在了。所以在Linux中,你在写入数据的时候,反而不能通过反复创建ClipboardContext去做,这样会导致你写入的内容丢失,比如你在rust中,在新开线程中创建ClipboardContext去写入剪贴板一个图片,然后写入完成后,新开线程自动结束,你再尝试去别的地方粘贴时,你会发现,你的剪贴板内并不存在者张图片。

@ChurchTao ChurchTao pinned this issue Oct 14, 2024
@doraemonkeys
Copy link
Author

@doraemonkeys* 如果从rust层面的内存开销来说的话,我推荐是全局只使用同一个context对象。我对api的设计也是可以重复使用的。

如果从操作系统层面上来说,不同系统的剪贴板其实实现方式是不一样的,例如Windows中,同一时刻,只能有同一个线程持有剪贴板具柄,所以就算ClipboardContext一直存在,但是实际上具柄会在下一个线程请求的时候给到别的线程。所以这个开销你是跑不了的。

在MacOS中,倒是最贴合的,允许重复使用同一个内存对象。

在Linux中,所谓的剪贴板,其实程序告诉X11服务器:“我这边提供一个文本可供其他程序读取”,所以当“我”这个线程结束的时候,我提供的内存,自然就不存在了。所以在Linux中,你在写入数据的时候,反而不能通过反复创建ClipboardContext去做,这样会导致你写入的内容丢失,比如你在rust中,在新开线程中创建ClipboardContext去写入剪贴板一个图片,然后写入完成后,新开线程自动结束,你再尝试去别的地方粘贴时,你会发现,你的剪贴板内并不存在者张图片。

我明白了,谢谢老哥。这个 issue 可以随时被关闭。

@ChurchTao ChurchTao added the question Further information is requested label Oct 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants