Мой код:
@Override
public void loadingDone(int whatIsDone) {
if (interrupt) {
return;
}
synchronized (this) {
// 1 - loaded with visu
// 2 - loaded without visu
switch (whatIsDone) {
case 1: // view.setLoading(true);
if (!view.isLoading()) {
//view.setStatusLineMsg(msg);
}
break;
case 3:
view.getParent().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
if ( view != null && view.isPmiUseModelviewAtStartup() ) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
view.changeModelViewBySUModelViewRegex();
}
}
});
view.setLoading(true);
// other code
case 4: // other code
default:
case 2:
view.setLoading(true);
break;
}
}
}
Внутри case 3
метод view.changeModelViewBySUModelViewRegex()
вызывает другой метод:
public Long[] getReferenceIdsColumn()
{
Long[] ret = null;
System.out.println("TreeDataItem.getReferenceIdsColumn()->"
+ "Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn)");
Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn);
//System.out.println("TreeDataItem.getReferenceIdsColumn(->if (referenceIds != null))");
if (referenceIds != null)
{
if (referenceIds instanceof Long[])
{
ret = (Long[]) referenceIds;
}
}
return ret;
}
Приложение вылетает при запуске: Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn)
. getModelItemAttrValue
написан в коде C++.
Я могу исправить это, увеличив спящий поток внутри case 3
, поэтому проблема должна быть не в коде (java или C++), а в синхронизации потоков? Если я использую точки останова во время отладки, кажется, что потоки успевают завершить задачи, и приложение не падает. В любом случае, это определенно жуткое решение:
if ( view != null && view.isPmiUseModelviewAtStartup() ) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
view.changeModelViewBySUModelViewRegex();
}
Скриншоты:
Буду признателен за любое лучшее решение!
Кажется, что вместо asyncExec помогает синхронизированный:
case 3:
view.getParent().getDisplay().syncExec(new Runnable() {
//code
}