我正在使用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
类中(第一段代码)。大概GLProfile
和VisualizerCanvas
处于由JVM加载的竞赛中,并且GLProfile
有时会获胜,从而导致崩溃。
有哪些替代继承的方法? 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 - javaprivate 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数组,因此您需要从数据库中获取此数组。