代码之家  ›  专栏  ›  技术社区  ›  kadina

是否可以在BrightScript中为ObserveField注册相同的函数来创建多个任务?

  •  1
  • kadina  · 技术社区  · 7 年前

    我们创建了从服务器接收程序信息和处理数据的任务。数据处理完成后,任务将通过设置响应字段进行通知,屏幕将收到通知,因为它已注册为响应的observefield,如下所示。

    屏幕:

    m.FetchSchedule = CreateObject("roSGNode", "FetchScheduleData")
    m.FetchSchedule.scheduleRequestContent = channels
    m.FetchSchedule.observeField("scheduleContent", "didReceiveInitialScheduleData")
    m.FetchSchedule.control = "RUN"
    

    屏幕中的观察者功能:

    sub didReceiveInitialScheduleData()
            if m.FetchSchedule.scheduleContent <> invalid and m.FetchSchedule.scheduleContent.getChildCount() > 0 and m.FetchSchedule.totalRows > 0
                ? "GuideScreen.brs - [didReceiveInitialScheduleData]"
        end if
    end sub
    

    这可以很好地解决单个任务的任何问题。 但是我们需要得到所有类别的频道的节目信息。现在我们按顺序这样做意味着一旦一个类别的任务完成,我们就为另一个类别创建另一个任务。 这是很好的工作,但它需要时间,因为我们正在做它的顺序。

    为了减少延迟,我们尝试为每个类别创建一个任务,并尝试同时运行。但无法思考如何修改观察函数。

    在屏幕中创建多个任务的代码:

    for x = 0 to m.global.AllNeighborhood.count() - 1
        m.FetchSchedule[x] = CreateObject("roSGNode", "FetchScheduleData")
        m.FetchSchedule[x].scheduleRequestContent = channels
        m.FetchSchedule[x].categoryIndex = x
        m.FetchSchedule[x].observeField("scheduleContent", "didReceiveInitialScheduleData")
        m.FetchSchedule[x].control = "RUN"
    end for
    

    我们正在将线程索引传递为“categoryIndex”。但无法修改观察函数“didReceiveInitialScheduleData”。因为我们需要观察器函数的索引来访问响应。即使我们将索引保存为“categoryIndex”,即使要访问它,我们也需要索引。我们被困在这里了。

    任何人都能告诉我们是否可以用相同的观察函数创建多个任务。如果可能的话,我们如何知道从哪个线程得到响应。如果不可能,是否可以解决此问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   juliomalves    7 年前

    通过在observer回调函数中指定参数,可以访问触发事件的节点。

    sub didReceiveInitialScheduleData(message as Object)
        task = message.getRoSGNode()
        ? task.scheduleContent 'This will print the respective task's scheduleContent field
        ...
     end sub
    

    这样,每当调用回调函数时,您就可以确切地知道是哪个任务触发了它,并且可以轻松地访问它的响应。

    推荐文章