当有多个 AWT-EventQueue 线程时如何选择

2023-12-30

我使用 DLL 注入和一些 jni 技巧成功地将自己的 Java 代码注入到正在运行的 Oracle Forms 应用程序中。 (Windows 7、32 位、Oracle Forms 11、JRE Java 8)

我能够遍历组件树并查询和设置一些基本 Java 对象中的值,例如来自类的对象oracle.forms.ui.VTextField

当我尝试模拟用户点击时,我陷入了困境oracle.apps.fnd.ui.Button

我尝试了两件事:

  1. 打电话给simulatePush的方法AbstractButton class
  2. 打电话给activate的方法PushButton class

(这两个类位于类层次结构中Button)

结果相同: 1. 首先,它工作正常:当按钮是“搜索”按钮时,搜索完成并显示结果。 2.然后,它立即中断该应用程序,并弹出一条消息FRM-92100 Your connection to the Server was interrupted.

从那里,应用程序被挂起。

Update:看来导致与服务器断开连接的错误是:

java.lang.SecurityException:此 KeyboardFocusManager 不是 安装在当前线程的上下文中 java.awt.KeyboardFocusManager.checkCurrentKFMSecurity(来源未知) 在 java.awt.KeyboardFocusManager.getGlobalFocusOwner(来源未知) 在 java.awt.KeyboardFocusManager.processSynchronousLightweightTransfer(未知 来源)于 sun.awt.windows.WComponentPeer.processSynchronousLightweightTransfer(本机 方法)位于 sun.awt.windows.WComponentPeer.requestFocus(未知 源)位于 java.awt.Component.requestFocusHelper(未知源)位于 java.awt.Component.requestFocusHelper(来源未知)位于 java.awt.Component.requestFocus(来源未知)位于 oracle.forms.handler.UICommon.updateFocus(来源未知)位于 oracle.forms.handler.UICommon.setFVP(来源未知) oracle.forms.handler.UICommon.setFVP(来源未知) oracle.forms.handler.UICommon.onUpdate(来源未知)位于 oracle.forms.handler.ComponentItem.onUpdate(来源未知)位于 oracle.forms.handler.JavaContainer.onUpdate(来源未知)位于 oracle.forms.handler.UICommon.onUpdate(来源未知)位于 oracle.forms.engine.Runform.onUpdateHandler(来源未知)位于 oracle.forms.engine.Runform.processMessage(来源未知)位于 oracle.forms.engine.Runform.processSet(来源未知)位于 oracle.forms.engine.Runform.onMessageReal(来源未知)位于 oracle.forms.engine.Runform.onMessage(来源未知)位于 oracle.forms.engine.Runform.processEventEnd(来源未知)位于 oracle.ewt.lwAWT.LWComponent.redispatchEvent(来源未知)位于 oracle.ewt.lwAWT.LWComponent.processEvent(来源未知)位于 oracle.ewt.button.PushButton.activate(来源未知)位于 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) at sun.reflect.NativeMethodAccessorImpl.invoke(来源未知)位于 sun.reflect.DelegatingMethodAccessorImpl.invoke(来源未知)位于 java.lang.reflect.Method.invoke(来源未知)位于 CustomAWT.run(CustomAWT.java:34)位于 java.awt.event.InitationEvent.dispatch(来源未知)位于 java.awt.EventQueue.dispatchEventImpl(来源未知)位于 java.awt.EventQueue.access$400(来源不明)位于 java.awt.EventQueue$2.run(来源未知)位于 java.awt.EventQueue$2.run(来源未知)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.AccessControlContext$1.doIntersectionPrivilege(未知 源)位于 java.awt.EventQueue.dispatchEvent(未知源)位于 java.awt.EventDispatchThread.pumpOneEventForFilters(来源未知) 在 java.awt.EventDispatchThread.pumpEventsForFilter(来源未知) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)位于 java.awt.EventDispatchThread.pumpEvents(来源未知) 在 java.awt.EventDispatchThread.pumpEvents(来源未知) java.awt.EventDispatchThread.run(来源未知)

我的代码在这里:CustomAWT.run(CustomAWT.java:34)并被称为invokeLater。问题可能是:当调用oracle.ewt.button.PushButton.activate方法,我不在正确的美国东部时间。

使用 Java 控制台中的“列出线程”,我得到:

Dump thread list ...
Group main,ac=30,agc=2,pri=10
    main,5,alive
    traceMsgQueueThread,5,alive,daemon
    Timer-0,5,alive
    Java Plug-In Pipe Worker Thread (Client-Side),5,alive,daemon
    AWT-Shutdown,5,alive
    AWT-Windows,6,alive,daemon
    AWT-EventQueue-0,6,alive
    SysExecutionTheadCreator,5,alive,daemon
    CacheMemoryCleanUpThread,5,alive,daemon
    CacheCleanUpThread,5,alive,daemon
    Browser Side Object Cleanup Thread,5,alive
    JVM[id=0]-Heartbeat,5,alive,daemon
    Windows Tray Icon Thread,5,alive
    Thread-13,5,alive
Group Plugin Thread Group,ac=3,agc=0,pri=10
    AWT-EventQueue-1,6,alive
    TimerQueue,5,alive,daemon
    ConsoleWriterThread,6,alive,daemon
Group http://xxxx.xxxx.xxxxx.xx:8001/OA_JAVA/-threadGroup,ac=13,agc=0,pri=4
    Applet 1 LiveConnect Worker Thread,4,alive
    AWT-EventQueue-2,4,alive
    thread applet-oracle/apps/fnd/formsClient/FormsLauncher.class-1,4,alive
    Applet 2 LiveConnect Worker Thread,4,alive
    thread applet-oracle.forms.engine.Main-2,4,alive
    Forms-StreamMessageReader,4,alive
    Forms-StreamMessageWriter,4,alive
    HeartBeat,4,alive
    Busy indicator,1,alive,daemon
    TaskScheduler timer,4,alive
    CursorIdler,4,alive
    Thread-14,4,alive
    Flush Queue,4,alive
Done.

所以,有THREE AWT-EventQueue线程...现在的问题是:如何查询/检索正确的线程,以及如何使Runnable传递给invokeLater在“好线程”中运行(我猜好的线程是最后一个(AWT-EventQueue-2)


经过大量的实验和谷歌搜索关键字,如EventQueue and ThreadGroup我终于找到了解决方案(在为我工作类别,请注意)。

我用sun.awt.AppContext班级。一些文档和来源here http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/sun/awt/AppContext.java(grepcode.com)

  1. 获取跑步的集合AppContext正在使用getAppContexts method.
  2. 对于每个检索到的AppContext,得到他的ThreadGroup使用getThreadGroup method.
  3. 随着ThreadGroup对象,使用getName method.
  4. 当线程组的名称以表单应用程序的 http: 地址开头时,检索Object带有键名的属性sun.awt.AppContext.EVENT_QUEUE_KEY, 使用get的方法AppContext.
  5. 检索到的对象是EventQueue。创建一个java.awt.event.InvocationEvent对象,传递你的Runnable到 CTOR,并使用postEvent的方法EventQueue.
  6. Your run方法将在正确的线程中执行。

Remarks:

  • 这个答案是一个特定的、适合我的解决方案,适用于通过 Internet Explorer 链接启动并在 java.exe 进程中运行的 Oracle Forms 应用程序。在这种情况下,3 个线程组如问题所示:main, Plugin Thread Group, and http://xxxx.xxxx.xxxxx.xx:8001/OA_JAVA/-threadGroup你的旅费可能会改变。
  • 如果您不使用完全反射,而是导入sun.awt.AppContext,编译器可能会发出以下形式的警告warning: sun.awt.AppContext is Sun proprietary API and may be removed in a future release这不太酷,但我暂时会接受这一点。
  • In the run方法,我测试OK了simulatePush的方法oracle.ewt.lwAWT.AbstractButton.
  • 这里模拟的方法是invokeLater. For invokeAndWait,需要更多代码postEvent称呼。请参阅一些来源EventQueue类,作为起点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当有多个 AWT-EventQueue 线程时如何选择 的相关文章

  • JFrame 图标在 Ubuntu 12.04 中不显示

    我使用一些图像图标开发了一个 Swing 应用程序 应用程序 jar 文件在 Windows 中按预期工作 但相同的 jar 文件在 Ubuntu 12 04 操作系统上不显示框架的图像图标 我的示例代码 ImageIcon ImageIc
  • Java NIO Pipe 与 BlockingQueue

    我刚刚发现它只有一个 NIO 工具 即 Java NIO Pipe 它是为在线程之间传递数据而设计的 与通过队列 例如 ArrayBlockingQueue 传递的更传统的消息相比 使用此机制是否有任何优势 通常 将数据传递给另一个线程进行
  • 涉及数学的方法给出与计算器不同的答案

    我是java新手 所以请耐心等待 我试图从比赛总数中获得胜利的百分比 但我正在做的事情还很遥远 我获取百分比的方法如下 public double winPercentage int wins int total return wins t
  • Android - 检测电容式触摸屏上的触摸压力?

    我听说过 MotionEvent e float press e getPressure 但这只会在没有触摸时返回 0 当我的手指触摸屏幕时返回 1 是否可以找到手指在触摸电容屏上施加的压力值 或者我的预感是否正确 即这只适用于电阻屏幕 M
  • 为 Nimbus 外观设计简单的单元渲染器

    我有一个简单的单元格渲染器 它由一些组成JLabels 渲染器本身扩展JPanel 并且我正在尝试让它在 Nimbus 的外观和感觉中合理地渲染 基本上发生的事情是在lighter行 正如 Nimbus 所具有的交替行着色 我的特定单元格渲
  • 在 Spring 中使用事务时创建提交后

    由于某些原因 我使用 Spring PlatformTransactionManager 手动执行事务提交和回滚 我需要做的是设置一个钩子 以便在提交事务后发生提交后操作 通过查看 void commit TransactionStatus
  • 正则表达式查找两个字符之间的内部匹配

    环境 Java 我想匹配两个字符串之间的字符 这是一个例子 foo
  • Java Swing 自定义形状(2D 图形)

    我需要绘制自定义形状 现在 当用户单击面板上的几个点时 我使用多边形创建一个形状 public void mouseClicked MouseEvent e polygon addPoint e getX e getY repaint 但我
  • 如何从网上获取源代码?

    我正在尝试从 Web 获取 HTML 源代码 我尝试这样做 u new URL url URLConnection con u openConnection con setRequestProperty User Agent Mozilla
  • Java DocumentBuilder - XML 文件中的缩进错误

    我尝试使用 DocumentBuilder 用 Ja va 编写一个简单的 XML 文件 我期望 XML 文件如下所示
  • 调用本机方法时返回 java.lang.UnsatisfiedLinkError

    我正在尝试为第三方 DLL 制作 Java 包装器 我创建了自己的 DLL 充当 JNI 和第三方 DLL 之间的中间人 在java中我加载这个DLL很好但是错误java lang UnsatisfiedLinkError sixense
  • 从 Apache Kafka 中的主题删除消息

    所以我是 Apache Kafka 的新手 我正在尝试创建一个简单的应用程序 以便我可以更好地理解 API 我知道这个问题在这里被问了很多 但是如何清除存储在主题上的消息 记录 我看到的大多数答案都说要更改消息保留时间或删除并重新创建主题
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • Android 调整图片大小

    我的图像存储在 SD 卡上 每个大小约为 4MB 我想调整每个的大小 而不是将其设置为 ImageView 但我不能使用BitmapFactory decodeFile path 因为异常 java lang OutOfMemoryErro
  • Jersey:返回字符串列表

    我尝试以 JSON 和 XML 形式返回 Jersey 中的字符串列表 我以为这会是微不足道的 我的第一次尝试是写这样的东西 GET Produces MediaType APPLICATION JSON MediaType APPLICA
  • 从java小程序获取正确的本地IP地址

    我想从我的 java 小程序确定本地 IP 地址 问题是当同一台机器上有多个 IP 地址时 该机器具有 LAN 和互联网连接 掌上电脑 VMWare 这是我的测试 public static void main String args tr
  • java银行程序帐户ID不上去?

    每次创建银行帐户时 帐户 ID 都应增加 1 但每次我尝试提取 Id 时 我只会得到帐户 ID 为 0 任何建议 因为我完全按照我学习的书中的方式进行操作而且它仍然没有更新 帐户构造函数 public class BankAccount p
  • 将菜单添加到空活动

    我在 Android Studio 中制作了一个 Android 应用程序 并想在其上创建一个选项菜单 我将其创建为一个空活动 现在意识到我最好创建一个空白活动来获取选项菜单 无论如何 是否可以在空活动中创建选项菜单 如果有人能给我指出一个
  • Java中不同格式的字符串解析为日期

    我想转换String to Date以不同的格式 例如 我从用户那里得到 String fromDate 19 05 2009 i e dd MM yyyy format 我想转换这个fromDate作为日期对象 yyyy MM dd fo
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di

随机推荐