2011-07-18 5 views
2

JOGLとSWT/AWTブリッジを使用してSWTアプリケーションを作成しています。オブジェクトをCompositeに作成しようとしていますタブの中に入れようとしています。JOGLでSWTを使用しているときにランダムクラッシュが発生する(競合条件?)

Working correctly

しかし、時間のほとんど(約75%おそらく、ランダムに)それが次のエラーメッセージでクラッシュ:

致命的なエラーがあり、それが動作するとき、それはこのようになります6.0_22-B22
のJava VM:OpenJDKのサーバPC = 0x0024843a、PID = 8618、TID = 2345560944

JREバージョンで
SIGSEGV(0xb):Javaランタイム環境によって検出されVM(20.0-B11混合モードのLinuxのx86)
誘導体:IcedTea6 1.10.2
分布:Ubuntuの11.04、パッケージ6b22-1.10.2-0ubuntu1〜11.04.1
問題のフレーム:C
[libpthread.so 0.0 + 0x843a] __pthread_mutex_lock + 0x11a

私もちょうど1キャンバスの代わりに、2でそれを試してみた、と私はまだ同じランダムなクラッシュを取得します。場合によっては、代わりにこのエラーメッセージが表示されます。

java:tpp.c:63:__pthread_tpp_change_priority:アサーション 'new_prio == -1 || (new_prio> = __sched_fifo_min_prio & & new_prio < = __sched_fifo_max_prio) 'が失敗しました。

恐らくスレッドの問題がありますか、競合状態ですか?不思議にも、コンポジットをタブにではなくシェルにまっすぐに置くと、うまく動作します(少なくともクラッシュは見られません)。

コードの該当ビットは次のようになります。

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ウィジェット/コンポジットと私はいけない何かをやっている?

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コンストラクタは次のようになりますか

答えて

3

最後に問題を自分で解決しました。それは確かに競合状態だっ判明 - 私はLinux上でEclipseで開発しています、と私は迷子のLinuxウィンドウイベントを防ぐために、次のコードが必要になります。

static { 
    GLProfile.initSingleton(false); 
} 

私はすでに私のVisualizerCanvasでこれを置くところ私のVisualizerクラス(コードの最初の部分)には含まれていません。おそらくGLProfileVisualizerCanvasがJVMによってロードされる競争にあって、GLProfileが勝つことがあり、クラッシュすることがありました。

関連する問題