api层:多线程、thttp_agent

在实现这里提供的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 tworker

图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编程大致可按以下流程。

  1. std::unique_ptr<net::tworker> executor_。用std::unique_ptr定义个存储tworker的智能指针。
  2. 有后台任务要执行了,通过构造tworker,创建并运行工作者线程。
  3. 工作者线程运行期间。如果MainThread是主线程,那在工作者线程可使用webrtc中的Send、Post向主线程发消息,更普遍的应该是Invoke。虽然是在工作者线程Send/Post/Invoke,但这些操作会在主线程执行,而执行时,工作者线程会阻塞中。
  4. 后台任务结束了,析构tworker。
  5. 一旦停止工作者线程,它就会立即销毁。如果想再次运行后台任务,只能重复步骤2,即再次构造tworker。

 

二、net::thttp_agent

thttp_agent是rose提供一个类,封装了一次http(s)会话,即发送请求、接收应答,内部全程使用chromium。它位于net命名空间。

全部评论: 0

    写评论: