糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > edt嵌入式确定性测试_CallSerially EDT和InvokeAndBlock(第1部分)

edt嵌入式确定性测试_CallSerially EDT和InvokeAndBlock(第1部分)

时间:2022-10-17 20:41:45

相关推荐

edt嵌入式确定性测试_CallSerially EDT和InvokeAndBlock(第1部分)

edt嵌入式确定性测试

我们上一次在解释了EDT背后的一些概念,因此,我们很高兴再次撰写有关EDT的文章,在开发人员指南以及有关Udemy的课程中都有关于EDT的部分,但是由于这是最重要的了解在Codename One中,它几乎没有重复。

关于EDT的好处之一是,其中的许多概念几乎与其他所有GUI环境(Swing / FX,Android,iOS等)中的概念相似。 因此,如果您能理解此说明,那么在其他平台上工作时也可能会有所帮助。

代号一可以具有任意数量的线程,但是在代号一中内部为事件调度线程创建了一个名为“ EDT”的线程。 这个名称不会处理线程错误,因为它处理包括绘画等在内的所有操作。

您可以将EDT想象成这样的循环:

while(codenameOneRunning) {performEventCallbacks();performCallSeriallyCalls();drawGraphicsAndAnimations();sleepUntilNextEDTCycle();}

在Codename One中,一般的经验法则是:每次Codename One可能在EDT上调用其方法(除非另有明确说明),每次在Codename One中调用的内容都应在EDT上(除非另有明确说明) 。

有一些值得注意的特殊情况:

NetworkManager / ConnectionRequest –在内部使用网络线程,而不是EDT。 但是,可以/应该从EDT调用它们。 BrowserNavigationCallback –由于其独特的功能,必须在本机浏览器线程上调用它。 显示invokeAndBlock / startThread –创建全新的线程。

除了这些,几乎所有东西都在EDT上。 如果不确定,可以使用Display.isEDT方法检查您是否在EDT上。

违反EDT

您可以通过两种主要方式违反EDT:

从不是EDT线程的线程(例如,网络线程或由您创建的线程)中以Codename One调用方法。 在EDT上执行CPU密集型任务(例如读取大文件)–这将有效地阻止所有事件处理,绘画等,使应用程序感觉很慢。

幸运的是,我们在模拟器中有一个工具:EDT违规检测工具。 这样可以有效地打印堆栈跟踪,以怀疑是否违反了EDT。 它不是傻瓜,可能会使您误判,但是它应该可以帮助您解决一些难以发现的问题。

那么如何防止EDT违规呢?为了防止滥用EDT线程(EDT上的慢速操作),只需使用new Thread(),Display.startThread或invokeAndBlock生成一个新线程(稍后再介绍)。 然后,当您需要将更新广播回EDT时,可以使用callSerially或callSeriallyAndWait。

致电

callSerially调用它在事件调度线程上收到的runnable参数的run()方法。 如果您在单独的线程上,这将非常有用,但是当我们使用EDT并希望将操作推迟到EDT的下一个周期(在下一次有更多讨论)时,这也很有用。 callSeriallyAndWait与串行调用相同,但是在返回之前,它会等待callSerially完成。 由于明显的原因,不能在EDT上调用它。

在本迷你教程的第二部分中,我将讨论invokeAndBlock以及为什么我们已经在EDT上时为什么要使用callSerially。

更新:您可以在此处阅读本文的第二部分。

翻译自: //11/callserially-the-edt-invokeandblock-part-1-2.html

edt嵌入式确定性测试

如果觉得《edt嵌入式确定性测试_CallSerially EDT和InvokeAndBlock(第1部分)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。