在实现这里提供的api时,用的都是chromium中技术。
一、net::tworker
tworker是rose提供一个类,封装了线程创建、销毁等操作。它位于net命名空间。使用时就两条语句:创建tworker实例、销毁tworker实例。
创建tworker实例:创建并立即运行线程
std::unique_ptr<net::tworker> executor_; executor_.reset(new net::tworker(std::bind(&tfaceprint::DoWork, this), std::bind(&tfaceprint::OnWorkStart, this)));
销毁tworker实例:停止并销毁线程
executor_.reset();
1.1 构造tworker时的参数
<chromium>/base/rose/thread2.h ------ tworker(const std::function<void (bool& exit)>& DoWork, const std::function<void ()>& OnWorkStart = NULL, const std::function<void ()>& DoWorkDone = NULL, const std::function<void ()>& OnTriggerExit = NULL, const std::string& name = "");
前4个参数都是函数指针,其中DoWork是线程函数,不能为NULL。第5个参数是线程名称,默认名叫“WorkerThread”。

图1中把左侧线程称为“MainThread”,并不要求一定是该app的主线程,只是一个已存在的线程而已。绿色表示构造tworker时,可自定义的4函数,所在位置表示了执行时所在的线程,以及执行的时刻。
- OnWorkStart(运行在MainThread)。让app有机会在执行线程函数前做些操作。此时新线程未创建。
- DoWork(运行在新线程)。线程函数,不能为NULL。
- DoWorkDone(运行在MainThread)。让app有机会在新线程退出后做些操作。此时新线程已毁销。
- OnTriggerExit(运行在MainThread)。在~tworker(),率先执行这函数。作用是是让app有机会执行保证能退出DoWork的操作。举个例子,线程函数是个while(_exit)循环。为保证能退出,可在OnTriggerExit把_exit置为false。当然,app可在其它地方设置_exit=false,这里只是多提供一个选择而已。
- name。线程名称。它往往用在调试阶段,让直观看到正调试代码在哪线程执行。
有了tworker,app编程大致可按以下流程。
- std::unique_ptr<net::tworker> executor_。用std::unique_ptr定义个存储tworker的智能指针。
- 有后台任务要执行了,通过构造tworker,创建并运行工作者线程。
- 工作者线程运行期间。如果MainThread是主线程,那在工作者线程可使用webrtc中的Send、Post向主线程发消息,更普遍的应该是Invoke。虽然是在工作者线程Send/Post/Invoke,但这些操作会在主线程执行,而执行时,工作者线程会阻塞中。
- 后台任务结束了,析构tworker。
- 一旦停止工作者线程,它就会立即销毁。如果想再次运行后台任务,只能重复步骤2,即再次构造tworker。
二、net::thttp_agent
thttp_agent是rose提供一个类,封装了一次http(s)会话,即发送请求、接收应答,内部全程使用chromium。它位于net命名空间。