码迷,mamicode.com
首页 > 编程语言 > 详细

在指定的CEF线程上执行任务

时间:2016-02-16 13:29:30      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

CEF有几种线程,比如TID_UI、比如TID_RENDER,每种都有特定的含义,具体类别定义在cef_types.h中,摘录如下:

typedef enum {
// BROWSER PROCESS THREADS -- Only available in the browser process.

  ///
  // The main thread in the browser. This will be the same as the main
  // application thread if CefInitialize() is called with a
  // CefSettings.multi_threaded_message_loop value of false.
  ///
  TID_UI,

  ///
  // Used to interact with the database.
  ///
  TID_DB,

  ///
  // Used to interact with the file system.
  ///
  TID_FILE,

  ///
  // Used for file system operations that block user interactions.
  // Responsiveness of this thread affects users.
  ///
  TID_FILE_USER_BLOCKING,

  ///
  // Used to launch and terminate browser processes.
  ///
  TID_PROCESS_LAUNCHER,

  ///
  // Used to handle slow HTTP cache operations.
  ///
  TID_CACHE,

  ///
  // Used to process IPC and network messages.
  ///
  TID_IO,

// RENDER PROCESS THREADS -- Only available in the render process.

  ///
  // The main thread in the renderer. Used for all WebKit and V8 interaction.
  ///
  TID_RENDERER,
} cef_thread_id_t;

关于这些线程的说明,看上面代码里的注释,另外亦可以参开这里:https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-threads

我们要想在某个线程上执行任务,比如你在Browser进程里想弹出个窗口,就要在TID_UI线程上来执行你的代码。类似这种任务,可以通过CefTask来完成。很简单,cef_task.h里有CefTask接口的声明,我们继承它,然后再使用CefPostTask即可。

代码类似下面:

#include "include/cef_task.h"

void doSomethingOnUIThread()
{
    MessageBox(...);
}

class SomeTask : public CefTask
{
    IMPLEMENT_REFCOUNTING(SomeTask);
public:
    void Execute()
    {
        doSomethingOnUIThread();
    }
};

void doSomething()
{
    if (CefCurrentlyOn(TID_UI))
    {
        doSomethingOnUIThread();
    }
    else
    {
        CefRefPtr<SomeTask> t = new SomeTask;
        CefPostTask(TID_UI, t);
    }
}

如果你不想自己写一个类实现CefTask接口,CEF还有一些辅助手段来帮到你。先看下面的代码片段:

if (!CefCurrentlyOn(TID_UI)) 
{
    // Execute on the UI thread.
    CefPostTask(TID_UI,
        base::Bind(&ClientHandler::CloseAllBrowsers, this, force_close));
    return;
}

这是CefSimple里的,它使用了base::Bind来生成一个Functor,用法类似STL的bind,包含”include/base/cef_bind.h”头文件即可。


就这样吧。

其他参考文章详见我的专栏:【CEF与PPAPI开发】。

在指定的CEF线程上执行任务

标签:

原文地址:http://blog.csdn.net/foruok/article/details/50674141

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!