我正在开发一个简单的排序算法演示应用程序。我有一些用JavaScript编写的排序算法,还有一个HTML页面可以试用它们。我已经分别测试了算法,并且它们工作正常。
您可以输入自己的数组,也可以为您生成一个随机数组。如果数组的大小太大,无论是生成它还是对其进行排序,都会挂起UI,因此我添加了一个Webworker,它在单独的线程中执行这些操作。
该应用程序记录其正在执行的操作。在网络工作者之前,当处理非常大的阵列时,日志只会在过程完成后突然出现,但是由于有了网络工作者,日志才在每个步骤完成后立即出现。同样,页面仍可滚动,而没有工作人员,一切将冻结,直到完成工作为止。
在将计算繁重的元素委派给Webworker之后,我期望页面上的元素保持完全交互性,但事实并非如此。无论如何,页面上的所有按钮等均无响应。确切地说,它们会在很短的时间内保持交互状态,然后冻结-例如,如果我将鼠标悬停在按钮上,光标将改变形状,但是无论我将其移动到何处,光标都将保持冻结状态我单击,直到网络工作完成后,该点击才会注册。这是一个问题,因为我有“停止”按钮,如果生成数组或对其进行排序花费的时间太长,用户可能会单击以停止Webworker。就目前情况而言,停止按钮会冻结,如果单击它们,则仅在工作人员完成操作后才会生效,实际上使它们无用。
如何确保页面上的控件仍然可用?谢谢!
最佳答案
因此,我遇到了我认为同样的问题,并且忍受了几天的时间。幸好我遇到了这个问题:https://nolanlawson.com/2016/02/29/high-performance-web-worker-messages/
出于某种原因,它似乎在Chrome和Firefox上都出现,当Webworkers发布消息时,它在打包数据的过程中冻结了主线程。
如果在发布消息时使用JSON对所有对象进行完全序列化,那么似乎一切都将运行得更加顺利。