2012-10-14 11 views
5

私はかなり基本的なテストプログラムを書いています(私は、LWJGLのOpenGLクラスの周りにラッパーを書いていますが、それは以前はコンカレントプログラムを書いたことがないので、マルチスレッディングを行うことにしました)。 プログラムが終了すると、私はいつも警告を受け取りますinvokeStaticMethodへの呼び出しを解決できませんか?

私は実際にプログラムが主な機能を開始する前に警告を受け取ります。

Reflection warning, NO_SOURCE_PATH:1 - call to invokeStaticMethod can't be resolved. 

私も、コンパイル時に警告を得ることはありません、私はむしろ奇妙見つける:混乱のため申し訳ありませんが(私はこれが私のすべてでプログラムが、Clojureの自体ではなく、何かではないかもしれないと思います)。とにかく、ここにプログラムされています

(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ではなく、むしろエージェントか何かでスレッドを開始していないが、私は完全にはないことを聞いて、あまりにも慣用ではありませんどのように動作するのか把握していますが)問題ではない短いプログラムを推測します。

+1

単純なスレッドが必要な場合は、エージェントの代わりに 'future'を使用できます。すなわち '(未来(レンダリング))'です。また、 'Thread/sleep'はOKです。h​​ttp://clojuredocs.org/clojure_core/clojure.core/futureを参照してください。 – noahlz

+0

警告は' opengltuts.opengl'から来ていないのでしょうか?どこかで、オーバーロードされた静的メソッドを呼び出していて、正確な呼び出しを解決できません。実行時に発生することに関して、実行時にコードを生成していますか? – noahlz

+0

@noahzいいえコードを生成していません。そして、これはプログラムの終わりに起こります。私はすでにopengl関数を呼び出していることが長いです。 また、将来のためにこれはちょっと奇妙です。それは私にいくつかの点を保存しますが、今では、いつ終了するか分からないので、最後に(シャットダウンエージェント)という奇妙な呼び出しが必要です。ああ、もちろん、副作用を引き起こすゼロ値を逆参照しても、私と一緒に座っているわけではありません。 私はタイミングが間違っていました - 私は主な機能に入る前に警告を受け取ります。 – Cubic

答えて

0

実行時にClojureソースコードがロードされコンパイルされています(http://clojure.org/compilation参照)。これは、プログラムの実行まで反映警告が表示されない理由です。

あなたがそう、ここで、静的メソッドに対する反射呼び出しを作っている場所を決定することは困難であるが、私はお勧めの手順は以下のとおりです。

  1. (set! *warn-on-reflection* true)または(binding [*warn-on-reflection* true] body)あなたを追加し、あなたの(ns)宣言
  2. (:gen-class)を追加します反射的な呼び出しが発生していると思われる。
+0

私はleiningenプロジェクト設定:warn-on-reflectionでコンパイルします。私はすべてのモジュールに対してリフレクション警告を受け取りますが、コンパイル時にそれらを引き起こすものはありません。 – Cubic

+0

'lein compile'を実行した後、' target/classes/'の下に何が表示されますか? – noahlz

+0

opengltuts-> ns $ function.classの名前を持つクラスの束。同様に 'core__init.class' ' core $ loading__4784__auto__と同様です。クラス ' ' core $ _main $ fn__155.class' 'core $ _main $ fn__157.class' – Cubic

関連する問題