1

我安装了 VTK 工具包,并在 Eclipse 中使用了 VTK 的 Java 包装器。我将 vtk.jar 添加到我的 java 项目中,并将环境变量设置为指向我的 VTK 安装。基本上,它正在工作。找到 vtk 类等并启动程序,至少直到我到达显示窗口的地步。

例如以下示例程序: http ://www.vtk.org/Wiki/VTK/Examples/Java/Imaging/ImageTest

如果我运行它,OS-X(或 Cocoa)会抛出以下异常,说明 UndoManager 存在一些问题:

我不知道我做错了什么或者是什么导致了这个问题,有人有什么想法吗?

2012-05-22 22:48:09.093 java[925:1a03] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-833.25/Misc.subproj/NSUndoManager.m:324
2012-05-22 22:48:09.093 java[925:1a03] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
2012-05-22 22:48:09.096 java[925:1a03] (
    0   CoreFoundation                      0x00007fff9363cf56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8aa9fd5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff9363cd8a +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x00007fff910a371f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 169
    4   Foundation                          0x00007fff9101295f +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 144
    5   AppKit                              0x00000001025680ef -[NSApplication run] + 596
    6   libvtkRendering.5.10.dylib          0x000000010ff8c2df -[vtkCocoaServer start] + 335
    7   libvtkRendering.5.10.dylib          0x000000010ff8cf87 _ZN30vtkCocoaRenderWindowInteractor5StartEv + 293
    8   libvtkRenderingJava.5.10.0.dylib    0x000000010f94f29e Java_vtk_vtkRenderWindowInteractor_Start_15 + 62
    9   ???                                 0x0000000103b70d6e 0x0 + 4357295470
    10  ???                                 0x0000000103b6585a 0x0 + 4357249114
)
2012-05-22 22:48:09.096 java[925:1a03] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-833.25/Misc.subproj/NSUndoManager.m:324
2012-05-22 22:48:09.096 java[925:1a03] An uncaught exception was raised
2012-05-22 22:48:09.097 java[925:1a03] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
2012-05-22 22:48:09.098 java[925:1a03] (
    0   CoreFoundation                      0x00007fff9363cf56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8aa9fd5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff9363cd8a +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x00007fff910a371f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 169
    4   Foundation                          0x00007fff9101295f +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 144
    5   AppKit                              0x000000010256819c -[NSApplication run] + 769
    6   libvtkRendering.5.10.dylib          0x000000010ff8c2df -[vtkCocoaServer start] + 335
    7   libvtkRendering.5.10.dylib          0x000000010ff8cf87 _ZN30vtkCocoaRenderWindowInteractor5StartEv + 293
    8   libvtkRenderingJava.5.10.0.dylib    0x000000010f94f29e Java_vtk_vtkRenderWindowInteractor_Start_15 + 62
    9   ???                                 0x0000000103b70d6e 0x0 + 4357295470
    10  ???                                 0x0000000103b6585a 0x0 + 4357249114
)
2012-05-22 22:48:09.098 java[925:1a03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff9363cf56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8aa9fd5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff9363cd8a +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x00007fff910a371f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 169
    4   Foundation                          0x00007fff9101295f +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 144
    5   AppKit                              0x000000010256819c -[NSApplication run] + 769
    6   libvtkRendering.5.10.dylib          0x000000010ff8c2df -[vtkCocoaServer start] + 335
    7   libvtkRendering.5.10.dylib          0x000000010ff8cf87 _ZN30vtkCocoaRenderWindowInteractor5StartEv + 293
    8   libvtkRenderingJava.5.10.0.dylib    0x000000010f94f29e Java_vtk_vtkRenderWindowInteractor_Start_15 + 62
    9   ???                                 0x0000000103b70d6e 0x0 + 4357295470
    10  ???                                 0x0000000103b6585a 0x0 + 4357249114
)
terminate called throwing an exception

建议的 VM 参数导致此错误:

2012-05-23 09:10:18.635 java[747:307] [Java CocoaComponent compatibility mode]: Enabled
2012-05-23 09:10:18.635 java[747:307] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2012-05-23 09:10:18.985 java[747:d303] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x7fa108c64600> '(null)') unlocked when not locked
2012-05-23 09:10:18.985 java[747:d303] *** Break on _NSLockError() to debug.
4

1 回答 1

0

This could be a problem related to the Cocoa restriction that some things can be run only on the first thread that the process runs. The same issue arises with the SWT event loop, for example. The problem is that main method is not executed on the first thread because it is reserved for AWT's event loop -- for the same reason. The workaround: use the JVM switch -XstartOnFirstThread.

于 2012-05-22T21:04:10.710 回答