我有一个 JavaFX 应用程序,它可以在屏幕上为机器人(黑点)设置动画,并在它们去过的任何地方在浅灰色背景上绘制一条小白线(想想 Tron)。为此,我保留了机器人和所有白色像素的所有坐标。机器人的行为由实现 Runnable 的不同线程控制,并且可以在模拟运行时更改。机器人坐标存储在 HashMap 中,坐标是扩展 Point 的类,并使用双精度数来提高 x 和 y 值的内部计算精度。对于白点,我使用 HashMap,因为整数精度足以满足它们,因为它们不会移动并无限期地停留在屏幕上的 x 和 y 坐标处。
现在程序运行得很好,但是当存储白点点的 HashMap 增长时,应用程序的 JavaFX 线程崩溃的可能性就越来越大(想想看,更具体地说,它只是绘制机器人的画布。 )控件的滑块保持响应,迭代的文本字段和 HashMap 的大小不断更新。但没有任何动画,几秒钟后画布变成白色。增加 Thread.sleep(ms) 的 ms 可以使程序更加稳定,但速度已经非常慢了。而且,这种情况在我的慢速学校上网本(运行 Win XP)上比在我的家用台式电脑(运行 Win7 64 位)上发生得更频繁、更快。例外也有不同的。对于台式电脑来说,如下:
java.lang.InternalError: Unrecognized PGCanvas token: 68
at com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:651)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:320)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:187)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:39)
at com.sun.javafx.sg.BaseNode.render(BaseNode.java:1145)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:204)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:420)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:187)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:39)
at com.sun.javafx.sg.BaseNode.render(BaseNode.java:1145)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:117)
at com.sun.javafx.tk.quantum.AbstractPainter.paintImpl(AbstractPainter.java:175)
at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:73)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
at com.sun.prism.render.RenderJob.run(RenderJob.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at …Run Code Online (Sandbox Code Playgroud) 我有一个小记录器函数,它可能返回两个处理程序以同时记录到 RotatingFileHandler 和 sys.stdout。
\nimport os, logging, sys\nfrom logging.handlers import RotatingFileHandler\nfrom config import *\n\ndef get_logger(filename, log_level_stdout=logging.WARNING, log_level_file=logging.INFO, echo=True):\n logger = logging.getLogger(__name__)\n if not os.path.exists(PATH + '/Logs'):\n os.mkdir(PATH + '/Logs')\n\n logger.setLevel(logging.DEBUG)\n\n if echo:\n prn_handler = logging.StreamHandler(sys.stdout)\n prn_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))\n prn_handler.setLevel(log_level_stdout)\n logger.addHandler(prn_handler)\n\n file_handler = RotatingFileHandler(PATH + '/Logs/' + filename, maxBytes=1048576, backupCount=3)\n file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))\n file_handler.setLevel(log_level_file)\n logger.addHandler(file_handler)\n return logger\nRun Code Online (Sandbox Code Playgroud)\n一般来说,这工作正常,但某些正在记录的字符串似乎是在 cp1252 中编码的,并且在尝试通过记录器函数将它们打印到标准输出时抛出(非致命)错误。应该注意的是,在错误消息中可以打印完全相同的字符。将它们记录到文件中也不会导致任何问题。只有控制台 - sys.stdout - 会抛出此错误。
\n--- Logging error ---\nTraceback (most recent call last):\n File "C:\\Program Files\\Python38\\lib\\logging\\__init__.py", line 1084, in …Run Code Online (Sandbox Code Playgroud)