将SWT与JOGL一起使用时,随机崩溃(竞赛条件?) - java

我正在使用JOGL和SWT / AWT桥编写SWT应用程序,并且试图在GLCanvas内创建多个Composite对象,然后尝试将其放置在选项卡中。当它起作用时,它看起来像这样:

但是大多数情况下(可能随机达到约75%),它崩溃并显示以下错误消息:

Java运行时环境检测到致命错误:
SIGSEGV(0xb)at pc = 0x0024843a,pid = 8618,tid = 2345560944

JRE版本:6.0_22-b22
Java VM:OpenJDK服务器VM(20.0-b11混合模式linux-x86)
导数:IcedTea6 1.10.2
发行:Ubuntu 11.04,package 6b22-1.10.2-0ubuntu1〜11.04.1
问题框架:C
[libpthread.so.0 + 0x843a] __pthread_mutex_lock + 0x11a

我也只用了一个画布,而不是两个,尝试了它,但我仍然遇到相同的随机崩溃。有时,我收到此错误消息:

Java:tpp.c:63:__pthread_tpp_change_priority:断言`new_prio == -1 || (new_prio> = __sched_fifo_min_prio && new_prio <= __sched_fifo_max_prio)'失败。

大概有线程问题,也许是竞争状况?奇怪的是,如果我尝试将复合材料直接放在外壳上而不是在选项卡上,它可以正常工作(或者至少我没有看到它崩溃)。

相关的代码如下:

tabFolder = new CTabFolder(shell, SWT.BORDER);
tabFolder.setSimple(false);

final Composite composite = new Composite(tabFolder, SWT.NONE);
composite.setLayout(new FillLayout());
new VisualizerCanvas(composite, MeshFactory.loadObj("meshes/teapot_sealed.obj"));
new VisualizerCanvas(composite, MeshFactory.loadObj("meshes/duck.obj"));

final CTabItem item = new CTabItem(tabFolder, SWT.CLOSE);
item.setText("Test");
item.setImage(new Image(display, "img/test.jpg"));
item.setControl(composite);

VisualizerCanvas构造函数如下所示:

public VisualizerCanvas(Composite parent, Mesh mesh)
{
    // Set up the canvas
    GLProfile glProfile = GLProfile.getDefault();
    GLCapabilities glCapabilities = new GLCapabilities(glProfile);
    glCapabilities.setDoubleBuffered(true);
    glCapabilities.setHardwareAccelerated(true);
    glCanvas = new GLCanvas(glCapabilities);
    glCanvas.addGLEventListener(this);

    // Create the embedded AWT frame using the SWT/AWT bridge
    Composite composite = new Composite(parent, SWT.EMBEDDED | SWT.BORDER | SWT.NO_BACKGROUND);
    composite.setLayout(new FillLayout());
    Frame frame = SWT_AWT.new_Frame(composite);
    frame.add(glCanvas);

    // Add an animator to automatically update the canvas at 30fps
    animator = new FPSAnimator(glCanvas, 30);
    animator.add(glCanvas);
    animator.start();

    this.mesh = MeshFactory.normalizeMesh(mesh);
}

我在做我不应该使用SWT小部件/复合材料的事情吗?

java参考方案

终于自己解决了这个问题。事实证明,这确实是一个竞争条件-我正在Linux上的Eclipse中进行开发,并且我需要以下代码来防止Linux窗口事件丢失:

static {
    GLProfile.initSingleton(false);
}

我已经将它放在我的VisualizerCanvas类中,但是没有放在我的Visualizer类中(第一段代码)。大概GLProfileVisualizerCanvas处于由JVM加载的竞赛中,并且GLProfile有时会获胜,从而导致崩溃。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java-固定大小的列表与指定初始容量的列表之间的差异 - java

我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…

从方法返回数组-Java - java

private static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。