小编par*_*tje的帖子

结合Java Swing和Java3D:并发性能问题

我将Swing和Java3D结合在一起.应使用Event Dispatcher Thread完成swing组件的操作,而Java3D组件的操作应在BehaviourSchedulerThread中完成.

Java3D渲染场景,然后执行与场景关联的所有行为.

我在Canvas3D上启用了MouseListener.事件将发布到AWT事件队列中.然后我想基于这些事件修改Java3D环境,所以我使用了一个特殊的行为,我可以将Runnable发布到.这确保Runnable在Java3D的行为周期中执行(并且在渲染周期期间不要修改任何内容).

假设行为中的某些操作想要修改Swing模型.然后我必须向EDT发布一个新的Runnable.

这是正确的方法吗?

使用这种技术,我在鼠标监听器上遇到了很多问题.我在行为中更新了Java3D模型中的一个点,同时更新了swing GUI.

更新:问题可以更明确地定义如下:

我有一个JButton"旋转立方体",它有一个ActionListener.一旦触发了ActionListener,它就会将AWTEvent推送到Java3D行为中.一旦行为触发,它会修改场景图,然后修改JButton actionListener和文本以变为"停止旋转".

  1. 点击两次JButton.
  2. 第一个AWTEvent被调度到SpinActionListener.多维数据集开始旋转,JButton actionListener被修改为StopSpinningActionListener.
  3. 第二个AWTEvent被调度到StopSpinningActionListener.立方体停止旋转,JButton actionListener被修改为SpinActionListener.

实际发生的是以下内容:

  1. 单击JButton两次.两人都AWTEvent被派遣到了SpinActionListener.这将创建一个在J3D行为内执行的Runnable.
  2. 第一个AWTEvent启动一个计时器来旋转立方体.然后它将Runnable发布到EDT以修改按钮.
  3. 第二个AWTEvent启动一个计时器来旋转立方体.立方体现在旋转速度快两倍.然后它将Runnable发布到EDT以修改按钮.

显然,我不应该依赖于AWTEvent的顺序处理.我不能在EDT中等待触发行为,因为任何SwingUtilities.invokeAndWait()都会导致死锁.

java concurrency swing java-3d

10
推荐指数
1
解决办法
722
查看次数

使用VisualVM配置Eclipse RCP

我正在开发基于Eclipse RCP的应用程序.我想在我的应用程序中分析特定的方法:删除元素和刷新部分.

我成功地将VisualVM启动插件连接到Eclipse.在我的应用程序运行后,我从VisualVM执行了Profiler并在正在分析的应用程序中拖动/刷新了一些东西.最后,我没有在调用堆栈中看到相应的方法.我找不到任何对我的东西负责的方法,我什么也做不了.

为什么会这样?如果我在整个应用程序启动之前运行VisualVM - 一切似乎都没问题.每个方法在调用堆栈中都有正确的位置.我很好奇VisualVM的局限性.

java profiling visualvm eclipse-rcp

6
推荐指数
0
解决办法
992
查看次数

OSGi服务架构:根据消费者的要求创建服务

我正在Eclipse RCP中开发一个应用程序.我需要有关服务设计的设计决策方面的帮助.

我有一些用于REngine向其他模块提供对象的bundle .它REngine是计算引擎的接口,可以通过多种方式实现.捆绑包通过连接到远程服务器或启动本地计算线程来提供REngine实例.一些捆绑包需要通过GUI进行配置(但也需要在无头平台上提供).客户端Bundle可以请求多个REngine对象进行并行计算.

我目前注册这些模块以提供REngine服务.该服务由ServiceFactory创建,该服务启动本地计算实例或远程(服务器)实例.客户负责尝试REngine该类的所有服务注册并选择正确的服务注册.

执行此操作的代码可归纳如下:

class API.REngine { ... }

class REngineProvider.Activator {
    public void start(BundleContext ctx) {
      ctx.registerService(REngine.class.getName(), new REngineFactory(), null);
    }
}
class REngineProvider.REngineFactory implements ServiceFactory {
    public Object getService(Bundle bundle, ServiceReference reference) {
      return new MyREngineImplementation();
    }
    public void ungetService(REngine service) {
       service.releaseAssociatedResources();
    }
}

class RConsumer.Class {
    REngine getREngine() {
        ServiceReference[] references = bundleContext.getAllServiceReferences(REngine.class.getName(), null);
        for(ServiceReference ref: references) {
            try {
            return bundleContext.getService(ref);
            } catch …
Run Code Online (Sandbox Code Playgroud)

java osgi eclipse-rcp

5
推荐指数
1
解决办法
1121
查看次数

可重复使用环境的saveRDS

我正在构建一个R包并使用data-rawdata存储预定义RxODE模型库.这非常有效.

但是,生成的.rda文件会在每一代都发生变化.某些模型包含R环境,序列化似乎包含"创建时间"时间戳.这意味着每次data/重新生成目录时,所有文件都已更改...

是否有某种方法可以将R环境的序列化修改为可重现?

storeFile <- function(file) {
  env <- new.env()
  fun <- function(x) {x+3}
  environment(fun) <- env

  save('fun', file = file, ascii=TRUE)
}

storeFile('fileA.rda')
storeFile('fileB.rda')
message("Files are identical? ", identical(readLines('fileA.rda'), readLines('fileB.rda')) )
Run Code Online (Sandbox Code Playgroud)

r binary-reproducibility r-package

5
推荐指数
1
解决办法
77
查看次数

主机包类路径中是否包含导入的片段包?

我有一些关于 OSGi 片段和Class.forName(). 下面的例子说明了我的问题。

我有一个第三方包Foo。我不能Foo以任何方式修改。该包包含以下类:

public class Serializer {
    public String summarizeClass(String className) {
        Class<?> myClass = Class.forName(className);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我从 bundle Barfor调用此方法org.myPackage.MyClass,它将失败,因为MyClass它不在 bundle 的类路径上Foo

我可以简单地添加一个Foo.fragment依赖于Barto的片段来修改 bundle 的类路径Foo吗?还是这种依赖只适用于片段中的类?

长话短说:Class.forName()OSGi中的语义是什么,当在 Host 包的类中执行时?是否包括:

  • 问:捆绑类?答:是的。
  • 问:片段中包含的类?答:是的。来源
  • Q:导入的包和从需要的bundle导出的包?答:是的。
  • Q:所有fragment的需要bundle的导入包和导出包?答:我不知道。

java osgi

2
推荐指数
1
解决办法
1829
查看次数