【问题标题】:Titanium: Different execution contexts are not multi-threaded?Titanium:不同的执行上下文不是多线程的吗?
【发布时间】:2015-01-29 10:37:33
【问题描述】:

我正在尝试使用钛执行上下文在主应用程序上下文和其他应用程序上下文之间生成并行代码执行。我正在使用带有 url 属性的 CreateWindow 是指“lib”文件夹中的 .js 文件。但是通过在 iOS 和 Android 设备上记录执行,似乎在应用程序主线程上执行了不同的上下文,这里没有并行性。

我的 Alloy 控制器中的新上下文触发器:

var win2 = Ti.UI.createWindow({
  title: 'New Window',
  url: 'thread.js',
  backgroundColor:'#fff'
});

win2.open();
Ti.API.log('after open');

我的 thread.js 内容:

Ti.API.log("this is the new context");
Ti.App.fireEvent("go" , {});
while(true)
{
    Ti.API.log('second context');
}

这个 while 循环显然阻塞了等待它退出的主上下文(我的 Alloy 控制器)。

关于如何在后台执行一些代码(主要是繁重的 sqlite db 访问)以使 UI 响应的任何建议? (网络工作者不是我的选择)。

【问题讨论】:

    标签: multithreading titanium context-switch


    【解决方案1】:

    您可以尝试使用setInterval()setTimeout() 方法实现想要的行为。

    setInterval()[source]:

    function myFunc() {
        //your code
    }
    //set the interval
    setInterval(myFunc,2000) //this will run the function for every 2 sec.
    

    另一个建议的方法是在您需要后台行为时触发自定义事件,因为它是在自己的线程中处理的。 official documentation 也建议这样做。

    【讨论】:

    • 我不想要计时器行为,我想要一个连续的背景上下文。我的代码中的 while 循环只是一种了解 2 个上下文是否并行运行的方法。 setTimeout() 在同一个线程上运行所需的函数。
    • 好的,我删除了 setTimeout() 部分以避免人们尝试它并添加了事件机制的源。很抱歉没能帮到你。
    【解决方案2】:

    AFAIK,钛是单线程的,因为 JavaScript 是单线程的。您可以使用本机模块获得并行执行,但您必须为每个平台自己编写代码。

    另一种选择是使用网络工作者,但我认为这是一种 hack。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多