私はかなり原始的なテスト プログラムを作成しました (LWJGL の OpenGL クラスのラッパーを主に審美的な理由で作成していますが、これまで並行プログラムを実際に作成したことがないため、そこにマルチスレッドを導入することにしました)。プログラムが終了すると、常に警告が表示されます
プログラムがメイン関数に入る前に、実際に警告が表示されます。混乱して申し訳ありません(これは私のプログラムではなく、clojure自体の何かかもしれません):
Reflection warning, NO_SOURCE_PATH:1 - call to invokeStaticMethod can't be resolved.
ただし、コンパイル中に警告は表示されませんが、これはかなり奇妙です。とにかく、ここにプログラムがあります:
(ns opengltuts.core
(:import (org.lwjgl.opengl GL11 Display))
(:use opengltuts.opengl)) ;my wrapper
(def world-state (ref {:running true :color [1.0 0.0 0.0 1.0]}))
(defn render-world [state]
(apply glClearColor (:color state))
(glClear GL11/GL_COLOR_BUFFER_BIT)
(Display/update))
(defn render []
(Display/create)
(loop []
(let [world @world-state]
(when (:running world)
(do (render-world world)
(recur)))))
(Display/destroy))
(defn -main []
; without the annotation, I get a warning here too.
(let [render-thread (doto (Thread. ^Runnable render) (.start))]
(Thread/sleep 3000)
(dosync (commute world-state assoc :color [0.0 1.0 0.0 1.0]))
(Thread/sleep 3000)
(dosync (commute world-state assoc :running false))
(.join render-thread)))
これはおそらくあまり慣用的なものではありません (Clojure では通常、スレッドを開始するnew Thread
のではなく、エージェントか何かで開始すると聞きましたが、それがどのように機能するかはまだ完全には把握していません)。それは問題ではありません。