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

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开发】。

时间: 2024-08-10 23:31:02

在指定的CEF线程上执行任务的相关文章

【多线程】并发执行指定数量的线程

有时候为了控制并发规模,我们需要对每次启动的线程做个数量上的限制,可以使用Executors.newFixedThreadPool(int)这个方法. 例子 一个线程类,运行中休息几秒为了观察现象更为明显 package com.nicchagil.study.thread.cnblogs.No01启动固定数量的线程; import java.util.concurrent.TimeUnit; public class MyThread extends Thread { @Override pu

动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值

 1.项目包结构 array.h #ifndef _ARRAY_H_ #define _ARRAY_H_ /************************************************************************/ /* 初始化数组                                                          */ /**************************************************

Concurrent包总结——线程任务执行框架

一 Executor接口 Executor接口的对象是一种执行任务的方式.它能够使提交的任务和执行任务的线程的管理解耦.我们通常用Executor来代替new一个Thread对象来执行任务.这样可以省略底层线程的管理细节. 例如: executor.excute(new RunnableTask()); concurrent包中提供了比较常用的Executor的实现,这些实现类都实现了一个更加灵活的类ExecutorService.而ThreadPoolExecutor则提供了一个可扩展的线程池

单独线程上使用RunLoop开启NSTimer

//第一步:创建一个新的子线程,为了不阻塞当前线程 - (NSThread *)archiveringThread { static NSThread *_thread = nil; static dispatch_once_t onceToken; __weak __typeof(self)weakSelf = self; dispatch_once(&onceToken, ^{ __strong __typeof(weakSelf)strongSelf = weakSelf; //1. 创建

JS引擎线程的执行过程的三个阶段(二)

继续JS引擎线程的执行过程的三个阶段(一) 内容, 如下: 三. 执行阶段 1. 网页的线程 永远只有JS引擎线程在执行JS脚本程序,其他三个线程只负责将满足触发条件的处理函数推进事件队列,等待JS引擎线程执行, 不参与代码解析与执行. JS引擎线程: 也称为JS内核,负责解析执行Javascript脚本程序的主线程(例如V8引擎) 事件触发线程: 归属于浏览器内核进程,不受JS引擎线程控制.主要用于控制事件(例如鼠标,键盘等事件),当该事件被触发时候,事件触发线程就会把该事件的处理函数推进事件

Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)

周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博客,就代码论事,因此了解到一些 Qt 深层的实现,虽然是在 Qt 庞大的构架里只算的是冰山的一角,确让人颇为收益. 从 dbzhang800 的博客中转载两篇关于事件循环的文章,放在一起,写作备忘. 再次提到的一点是:事件循环和线程没有必然关系. QThread 的 run() 方法始终是在一个单独

PHP在linux上执行外部命令

PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数.2>反引号.3>popen()函数打开进程,三种方法来实现: 方法一:用PHP提供的专门函数(四个):PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec()1)exec()原型: string exe

Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)

一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数.2>反引号.3>popen()函数打开进程,三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(),shell_exec() 1)exec() 原型: string exec ( string$

JDK5.0 特性-线程任务执行架构 ScheduledExecutorService

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html 1 import java.util.concurrent.Callable; 2 3 import java.util.concurrent.ExecutionException; 4 5 import java.util.concurrent.ExecutorService; 6 7 import java.util.concurrent.Executors; 8