私はJNAを使用してUser32
関数にアクセスしています(ここではJavaと関係があるとは思いませんが、概念の問題です)。私のアプリケーションには、Canon SDK と通信する Java プロセスがあります。メッセージをディスパッチするには、以下の関数を使用しています。
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);
}
}
上記では、カメラ イベントを取得するたびに に追加しqueue
、各ループで をチェックしqueue
て処理しますTask
。もう 1 つの重要な情報: これは実行中のプロセスで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
}