5

私はかなり原始的なテスト プログラムを作成しました (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のではなく、エージェントか何かで開始すると聞きましたが、それがどのように機能するかはまだ完全には把握していません)。それは問題ではありません。

4

1 に答える 1

0

Clojure ソース コードは実行時に読み込まれ、コンパイルされます ( http://clojure.org/compilationを参照)。これが、プログラムが実行されるまでリフレクションの警告が表示されない理由です。

静的メソッドに対してリフレクション呼び出しを行っている場所を特定するのは難しいため、次の手順をお勧めします。

  1. 宣言(:gen-class)に追加(ns)
  2. リフレクティブ コールが発生していると思われる場所を追加し(set! *warn-on-reflection* true)ます。(binding [*warn-on-reflection* true] body)
于 2012-10-15T13:49:52.673 に答える