当我收到系统剪贴板的内容时,该呼叫很可能会暂停10秒钟。
我碰到了这个,因为我的弹出式菜单创建偶尔会挂起,因为我正在检查剪贴板的状态以启用/禁用粘贴选项。
将它缩小到getSystemClipboard()。getContents()后,我写了一个控制台应用程序,它只是循环并查询它。在Windows下它运行正常,但在Linux和X下,我有很多挂起。
在我的GUI应用程序中,如果有任何UI事件(即鼠标移动),10秒的挂起将被缩短。
我还运行了我的控制台应用程序指向Xvfb(无头X虚拟帧缓冲区),如果只有一个控制台应用程序连接到它,它通常成功,但有一些应用程序的副本点击相同的X显示错误开始发生。
以下是一个示例应用。我想知道这是否会给你带来同样的问题。
public class main {
public static void main(String[] args)
{
System.out.println("Clipboard class: " + Toolkit.getDefaultToolkit().getSystemClipboard().getClass() );
long progstart_ts = System.currentTimeMillis();
int slowcount = 0;
int MAXLOOP = 1000;
for(int i = 0; i < MAXLOOP; i++)
{
long start_ts = System.currentTimeMillis();
Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
long end_ts = System.currentTimeMillis();
long elapsed = end_ts - start_ts;
if ( elapsed > 1000 )
{
System.out.println("Loop " + i + ", " + elapsed);
slowcount++;
}
}
long progend_ts = System.currentTimeMillis();
long progelapsed = progend_ts - progstart_ts;
System.out.println("Total time: " + progelapsed);
System.out.println("Good/bad: " + (MAXLOOP - slowcount) + "/" + slowcount);
}
}