gpt4 book ai didi

Java 线程在不关注 OSX 时进入 hibernate 状态

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:03 24 4
gpt4 key购买 nike

我正在编写一个程序来监听系统剪贴板的变化。监听器在单独的线程上运行,并在剪贴板的内容更改时执行某些操作(例如,写入文件)。

我正在使用 ClipboardOwner interface 轮询剪贴板, 这样当我的程序失去剪贴板的所有权时(意味着另一个进程修改了剪贴板)我的程序中会触发一个事件让我读取更改。

public class OwnershipClipboardListener extends Thread implements ClipboardOwner
{
private Clipboard clipB = Toolkit.getDefaultToolkit().getSystemClipboard();

public void run()
{
/* Initialize ClipboardListener and gain ownership of clipboard */
}

@Override
public void lostOwnership(Clipboard clipboard, Transferable transferable)
{
/* Auto-fired when I lose Clipboard ownership.
Can do processing and regaining ownership here */
}
}

问题是,在 OSX 中运行时,仅当我手动 Cmd-Tab 到停靠栏中正在运行的进程图标时,对剪贴板的任何更改才会反射(reflect)出来。因此,如果在我切换到停靠图标之前有多个剪贴板操作,则只有最后一个有任何效果。我在 Linux 或 Windows 上没有遇到这个问题。

这就像程序失去焦点时线程进入 hibernate 状态,但唤醒时最后一个Event触发器仍然触发。有什么办法可以阻止这种 sleep 吗?

最佳答案

我怀疑 OSX 不提供剪贴板更改的通知,因此 Java 正在尽最大努力通过在它因其他原因被唤醒时通知您。

我的怀疑来自 NSPasteboard文档,特别是 changeCount 例程。它说:“因此,您可以在获得粘贴板所有权时记录更改计数,然后将其与 changeCount 返回的值进行比较,以确定您是否仍然拥有所有权。”没有提到使用事件来检测变化。

关于Java 线程在不关注 OSX 时进入 hibernate 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com