我有一个UUID和java util日期,它将文字作为#uuid和#inst,如何在不引用文字本身的情况下指定uuid或日期?clj-json不喜欢处理它们,当我尝试生成字符串时最终会抛出错误
{:timestamp (java.util.Date.)}
;{:timestamp #inst "2013-05-17T13:45:24.095-00:00"}
;but as a string the date changes format
{:timestamp (str (java.util.Date.))}
{:timestamp "Fri May 17 09:45:44 EDT 2013"}
(json/generate-string {:uuid (java.util.UUID/randomUUID)})
;#uuid "d66cf77f-13b6-4291-95cd-c2bb40aa36b3"
java.lang.Exception: Cannot generate d66cf77f-13b6-4291-95cd-c2bb40aa36b3
JsonExt.java:96 clj_json.JsonExt$Generator.generate
JsonExt.java:83 clj_json.JsonExt$Generator.generate
JsonExt.java:103 clj_json.JsonExt.generate
core.clj:18 clj-json.core/generate-to-writer
core.clj:26 clj-json.core/generate-string
NO_SOURCE_FILE:32 myapp.handler/eval8390
Run Code Online (Sandbox Code Playgroud) 我正在使用server.socket将数据流式传输到多个客户端,server.socket为每个客户端连接使用Threads.我目前有这样的事情:
(def clients (atom ())) ; connected clients defined globally for that namespace
(swap! clients conj a) ; adds a client (which is an atom itself as well), this is in a function that is run on the client's thread
;I want to better the process of removing a client!
(dosync (reset! clients (remove #{a} @clients))) ; removes client from list, run in a function on the client's thread
Run Code Online (Sandbox Code Playgroud)
我运行一个遍历每个客户端并抓取内容的函数,它在每个多个客户端线程上处于无限循环中,因此它同时运行:
(doseq [c @clients]
(print ((deref c) :content))
(flush))
Run Code Online (Sandbox Code Playgroud)
我在线程中使用Atoms的结论确实让程序顺利运行并允许非阻塞读取,所以我对此感到满意,除非我觉得重置全局客户端的Atom只是为了让我可以从中删除单个客户端这个名单是一个糟糕的举动.有没有更合适的方法来实现这一点使用交换!?我为clients atom选择了list,因为我在每个连接的客户端上运行doseq来获取内容并将其刷新到输出流套接字.
我开始了一个项目,其概念是在整个游戏中不断重复使用相同的texture2d对象,定期重新加载新纹理.随着时间的推移,我在运行时遇到了一个坏主意:System.OutOfMemoryException
bool loadImages(string image)
{
System.Diagnostics.Debug.WriteLine("beginning loading textures " + image);
try
{
//image_a = null;
//image_o = null;
//image_o.Dispose();
//image_a.Dispose();
image_o = Content.Load<Texture2D>("images/"+image);
image_a = Content.Load<Texture2D>("images/" + image+"_a");
return true;
}
catch
{
System.Diagnostics.Debug.WriteLine("cannot load textures " + image);
image_a.Dispose();
image_o.Dispose();
}
return false; //make sure the caller loads the subsequent image
}
Run Code Online (Sandbox Code Playgroud)
我猜想XNA在每次新的内容加载时都会保留过去的纹理,所以我重新编写了程序,而是保存一个游戏对象列表,每个对象都有自己的texture2d对象.在浏览列表后,我将处理前一个列表项的纹理对象,并将下一个列表项的纹理加载到其纹理对象.该列表只会在整个游戏中遍历一次,我只是定期进入下一个纹理集,我只会选择加载2个纹理,所以理论上应该始终只需要内存中的2个纹理.我仍然遇到内存错误.这就好像我完全不能依赖dispose方法及时释放内存中的纹理.
我正在加载的纹理都没有超过125KB,我正在为Windows Phone 7构建这个
删除不再需要的纹理的最佳方法是什么?参考代码:我应该创建新的texture2d对象,交换它们,并处理原件吗?
我有以下代码:
(do
(prn "sleeping for 60 seconds")
(Thread/sleep 6000)
(prn "kicking off calendar downloads @ " (new java.util.Date))
(let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
(map download links))
Run Code Online (Sandbox Code Playgroud)
我注意到let评估必须是最后的,否则它不会被评估.这对我来说很困惑.尽管如此,当我在循环中实现它时,let永远不会进行评估,因为我认为recur最终会被推断出来.
(while
(do
(prn "sleeping for 60 seconds")
(Thread/sleep 60000)
(prn "kicking off calendar downloads @ " (new java.util.Date))
(let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
(map download links))
))
Run Code Online (Sandbox Code Playgroud)
我也希望sleep在本do节末尾,但这真的没有实际意义.
我怎样才能 …