gpt4 book ai didi

Java Swing 显示停止更新,直到生成 X 事件

转载 作者:太空狗 更新时间:2023-10-29 11:16:46 25 4
gpt4 key购买 nike

编辑:最后的附加信息

我有一个(大型)Java Swing 应用程序,它展示了一些非常奇怪的行为。如果运行它的计算机闲置(没有鼠标或键盘输入)足够长的时间(在一个小时左右到几天之间变化),Swing 显示有时会完全停止更新(我们已经得到,除其他外,屏幕上显示的时钟停止更新)直到用户移动鼠标。移动鼠标后,我们的应用程序似乎可以正常运行。 (从另一个应用程序创建和删除窗口也会导致显示再次开始更新;键盘输入似乎不够。)

我们在运行 xorg-x11-server 1.1.1-48.13.e15 的 Linux 内核 2.6.25.14 上运行 Sun 的 JDK 1.6.0_07(我认为它是一个修改过的 RHEL 4 发行版,但我暂时不确定)。

在这种状态下,AWT 事件队列始终是“可运行的”,并且在几个 java2d 方法之一中 - 我最近的例子是:

at sun.java2d.loops.Blit.Blit (native method)
at sun.java2d.pipe.DrawImage.blitSurfaceData
at sun.java2d.pipe.DrawImage.renderImageCopy
at sun.java2d.pipe.DrawImage.copyImage
at sun.java2d.pipe.DrawImage.copyImage
at sun.java2d.pipe.ValidatePipe.copyImage
at sun.java2d.SunGraphics2D.drawImage
at sun.java2d.SunGraphics2D.drawImage
at <our code>

来自 GDB 的该线程的堆栈跟踪如下所示:

in poll()
in XAddConnectionWatch()
in _XRead()
in _XReply()
in XSync()
in X11SD_GetRasInfo()
in Java_sun_java2d_loops_Blit_Blit
in ??

此外,我们的应用程序通常有几个线程在后台渲染到 VolatileImages。处于这种状态时,这些线程始终处于 RUNNABLE 状态,但卡在如下调用中:

at sun.java2d.loops.FillRect.FillRect (Native Method)
at sun.java2d.pipe.LoopPipe.fillRect
at sun.java2d.SunGraphics2D.fillRect
at sun.java2d.SunGraphics2D.clearRect
at <our code: rendering to a VolatileImage>

这些线程的 GDB 堆栈跟踪是:

in pthread_cond_wait@@GLIBC_2.3.2
in Monitor::wait
in GC_locker::jni_lock_slow
in jni_GetPrimitiveArrayCritical
in BufImg_GetRasInfo
in Java_sun_java2d_loops_FillRect_FillRect
in ??

有没有人见过这样的事情?我们完全被难住了,我什至不确定下一步该怎么做才能确定问题所在。

编辑:问题仍然存在。 AWT 事件队列在 JStack 和 gdb 堆栈转储上基本上看起来总是一样的;我们已经看到这种情况发生,没有其他线程像我最初描述的那样同时卡住。

谢谢!

最佳答案

抱歉,我不使用任何 Java2D 东西,所以我不能确定——但我首先想到的是您的后台线程之一正在渲染到实时上下文。

如果是这种情况,那么在极少数情况下,它可能会与 AWT 线程(唯一允许实际呈现的线程)发生冲突,如果发生这种情况,您可以很容易地获得如您所见的结果——事实上,这正是我所期望的。

我可能是错的,但即使你认为我是错的,为什么不尝试让你的后台线程在 WorkerThread 上实际执行它们的任务——即使它会稍微影响你的性能,尝试一下也没什么坏处在测试期间。

关于Java Swing 显示停止更新,直到生成 X 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2207879/

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