Случайные сбои при использовании SWT с JOGL (состояние гонки?) - PullRequest
2 голосов
/ 18 июля 2011

Я пишу приложение SWT, используя JOGL и мост SWT / AWT, и пытаюсь создать несколько GLCanvas объектов внутри Composite, которые затем пытаюсь поместить во вкладку.Когда это работает, это выглядит так:

Working correctly

Но большую часть времени (возможно, около 75%, случайно) происходит сбой со следующим сообщением об ошибке:

Фатальная ошибка была обнаружена средой выполнения Java:
SIGSEGV (0xb) при pc = 0x0024843a, pid = 8618, tid = 2345560944

JRE версия: 6.0_22-b22
Java VM: виртуальная машина сервера OpenJDK (смешанный режим 20.0-b11 linux-x86)
Производная: IcedTea6 1.10.2
Распространение: Ubuntu 11.04, пакет 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) 'не удалось. </p>

Предположительно, есть проблема с многопоточностью, может быть, состояние гонки?Как ни странно, если я попытаюсь поместить композицию прямо на оболочку, а не на вкладку, она работает нормально (или, по крайней мере, я не видел ее сбой).

Соответствующий фрагмент кода выглядит следующим образом:

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?

1 Ответ

3 голосов
/ 19 июля 2011

Наконец-то решил проблему сам. Оказывается, это было действительно гоночное условие - я занимаюсь разработкой в ​​Eclipse для Linux, и мне нужен следующий фрагмент кода, чтобы предотвратить потерю событий окна Linux:

static {
    GLProfile.initSingleton(false);
}

Я бы уже поместил это в свой класс VisualizerCanvas, но не в свой класс Visualizer (первый фрагмент кода). Предположительно, GLProfile и VisualizerCanvas участвовали в гонке для загрузки JVM, и GLProfile иногда побеждал, что приводило к сбою.

...