我正在使用JNA来访问User32
函数(我认为这与Java无关,更多的是概念问题)。在我的应用程序中,我有一个Java进程与佳能SDK进行通信。为了分发任何消息,我使用以下函数:
private void peekMessage(WinUser.MSG msg) throws InterruptedException {
int hasMessage = lib.GetMessage(msg, null, 0, 0);
if (hasMessage != 0) {
lib.TranslateMessage(msg);
lib.DispatchMessage(msg);
}
Thread.sleep(1);
}
peekMessage
在一个循环中被调用,一切都运作良好。每当从相机拍摄一张照片时,我会得到事件并进行其他操作。
但是,我发现在相机无活动约15秒后(有时永远不会,有时只是在开始时),拍照不会给我任何下载事件。后来整个应用程序因为没有从相机接收到任何事件而变得无法使用。
这可能是什么原因?请告诉我需要的任何其他信息,我可以粘贴相关代码。
编辑:
初始化:
Map<String, Integer> options = new HashMap<String, Integer>();
lib = User32.INSTANCE;
hMod = Kernel32.INSTANCE.GetModuleHandle("");
options.put(Library.OPTION_CALLING_CONVENTION, StdCallLibrary.STDCALL_CONVENTION);
this.EDSDK = (EdSdkLibrary) Native.loadLibrary("EDSDK/dll/EDSDK.dll", EdSdkLibrary.class, options);
private void runNow() throws InterruptedException {
while (!Thread.currentThread().isInterrupted()) {
Task task = queue.poll();
if (task != null) {
int taskResult = task.call();
switch (taskResult) {
case (Task.INITIALIZE_STATE):
break;
case (Task.PROCESS_STATE):
break;
case (Task.TERMINATE_STATE): {
//queue.add(new InitializeTask());
Thread.currentThread().interrupt();
break;
}
default:
;
}
}
getOSEvents();
}
}
WinUser.MSG msg = new WinUser.MSG();
private void getOSEvents() throws InterruptedException {
if (isMac) {
receiveEvents();
} else {
peekMessage(msg);
}
}
以上,每当我收到相机事件时,就会将其添加到队列中,并在每次循环中检查队列以处理任何任务。还有一个重要的信息:这是在cmd上运行的进程,没有窗口。我只需要来自相机的事件,不需要其他东西。
注册回调函数的代码:
/**
* Adds handlers.
*/
private void addHandlers() {
EdSdkLibrary.EdsVoid context = new EdSdkLibrary.EdsVoid(new Pointer(0));
int result = EDSDK.EdsSetObjectEventHandler(edsCamera, new NativeLong(EdSdkLibrary.kEdsObjectEvent_All), new ObjectEventHandler(), context).intValue();
//above ObjectEventHandler contains a function "apply" which is set as callback function
context = new EdSdkLibrary.EdsVoid(new Pointer(0));
result = EDSDK.EdsSetCameraStateEventHandler(edsCamera, new NativeLong(EdSdkLibrary.kEdsStateEvent_All), new StateEventHandler(), context).intValue();
//above StateEventHandler contains a function "apply" which is set as callback function
context = new EdSdkLibrary.EdsVoid(new Pointer(0));
result = EDSDK.EdsSetPropertyEventHandler(edsCamera, new NativeLong(EdSdkLibrary.kEdsStateEvent_All), new PropertyEventHandler(), context).intValue();
//above PropertyEventHandler contains a function "apply" which is set as callback function
}
msg
由于某些原因无效。 - StevepeekMessage
被重复调用(它检查它的窗口并调用peekMessage
,否则调用Mac相应的方法)。不需要睡眠,我已经将其删除。 - JatinGetMessage
被阻塞,它只会挂起相应的插件而不是整个应用程序。这里有一个奇怪的现象:有时候GetMessage
确实会阻塞它,并且插件仍然处于冻结状态,但我可以看到从相机中派发出事件。有时候,即使没有从相机派发出事件,GetMessage
仍然会返回1
,也就是说,每次顺序地返回1
。最后关于msg
,我已经更新了帖子。 - Jatin