%H 24小时制 %I 12小时制

static std::string SerializeChronoDate(const char* format = "%Y-%m-%d %H:%M:%S") // format = %F %T
{
    char buffer[40] = {};
    {
        if (std::strftime(
            buffer, 
            std::size(buffer), 
            format, 
            std::localtime(std::addressof(static_cast<const std::time_t&>(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()))))
        ))
        {
            return std::string(buffer, std::size(buffer));
        }
    }

    throw std::runtime_error("failed to get current date as string");
}

众所周知,LUA是最强,效率最高的脚本,但是语法也是最难用的脚本,那么接下来也就看你们个人喜好挑选一款适合自己的嵌入式脚本了。

  • JavaScript语法 嵌入式脚本【适合做跨平台ARM工控机、物联网等项目使用,最低要求 64KB 内存即可运行 】

    https://github.com/jerryscript-project/jerryscript
    https://github.com/svaarala/duktape
  • 配到解释器 Espruino

    Espruino 是一个专门为微控制器(MCU)设计的 JavaScript 解释器,最低资源开销 128KB Flash & 8KB RAM,使用 MPL-2.0 协议开源。
    https://github.com/espruino/Espruino
    
    更多介绍:https://zhuanlan.zhihu.com/p/25058124
  • 其他语法 嵌入式脚本

    https://github.com/ChaiScript/ChaiScript/

通常一般的程序员第一时间会想起用10进制转二进制,然后取某一位是否位1 实际项目中是不允许这么低效且低能的做法,那么我们可以直接使用 位与运算。来决定我们取的某一位偏移值是多少。也就是移动到二进制的某一位。 ::(真棒)

#ifndef SETBIT
#    define SETBIT(x, y)            (x |= (1 << y))
#endif

#ifndef GETBIT
#    define GETBIT(x, y)            ((x) >> (y) & 1)
#endif
if (0 == DBRead(dbnumber, start, length, static_cast<void*>(buffer)))
{
    return 0 != static_cast<int32_t>(GETBIT(buffer[0], offset));
}

老话题新提,还是那个退出报错的流程。
cef是个启动容易退出难的框架,毕竟不是我们自己设计的东西。
1.
用户发送了 WM_CLOSE 消息,我们要检测浏览器是否存在!
如果存在则调用TryCloseBrowser()或者

    if (Chromium::BrowserHandler::GetInstance() && Chromium::BrowserHandler::GetInstance()->IsClosing())
    {
            Chromium::BrowserHandler::GetInstance()->CloseHostBrowser(false); // 取消关闭
            event->ignore(); // 取消关闭窗口继续执行
    }

整个流程不由主线程执行,因为CEF的内核设计与QT大致相同。如果你的CEF是基于多线程的启动,外部线程调用这些有关于浏览器操作的函数退出时会报错,所以,我们就把一系列的操作都交给

    bool BrowserClosure::PostClosure(const base::Closure& closure)
    {
        return CefPostTask(TID_UI, CefCreateClosureTask(closure));
    }

这样我们将任务投递给UI线程进行内部执行。

我们取消关闭后,由CEF再一次发送 WM_CLOSE 消息。进行CEF内部消息循环关闭,这里我们不去多说。

接下来的流程就是调用 OnBeforeClose 停止浏览器做最后的清理操作。

最后在入口函数增加(在执行CefQuitMessageLoop之前一定要释放掉你所有初始化函数的内存,否则会有异常的错误。)
原因不明,因为你必须在退出CEF消息循环之前释放掉你用过所有函数的内存,可能在此之后释放的话内部有一些操作会用到消息循环,所以没有了消息循环就会报错。
CefQuitMessageLoop
CefShutdown

至此结束,具体代码请看https://github.com/X-Crack/Publisher/blob/master/Source/Browser/Browser.WinMain.cc

我的目录:f:\\Development\\chromium

拉取成功:f:\\Development\\chromium\\src

开始拉取(cd 某盘:\chromium\)

    fetch --nohooks chromium

如果中途中断执行:

    gclient sync --nohooks --with_branch_heads --jobs 16

拉取完全成功会提示:

    Syncing projects: 100% (xxx/xxx), done.
    Running: git submodule foreach 'git config -f $toplevel/.git/config submodule.$name.ignore all'
    Running: git config --add remote.origin.fetch '+refs/tags/*:refs/tags/*'
    Running: git config diff.ignoreSubmodules all

拉取成功执行 - 获得所有发布tags信息
查看

    git show-ref --tags

获取

    git fetch --tags

开始拉取(依次执行)

    git checkout -b chromium_release_branch 87.0.4280.88
    gclient sync --with_branch_heads --with_tags --no_auth --jobs 16 -D

如果报错,请注意是否有(SET DEPOT_TOOLS_WIN_TOOLCHAIN=0)排除问题后继续执行

    gclient sync --with_branch_heads --with_tags --no_auth --jobs 16 -D

资料仅供参考,一切情况还要以你的环境为准,尽可能在虚拟机全新系统中进行。

所有版本:https://chromiumdash.appspot.com/releases
参考资料:https://www.chromium.org/developers/how-tos/get-the-code/working-with-release-branches