linux 下的gettimeofday 函数在windows上的替换方案

方案一:

#include <time.h>
#ifdef WIN32
#   include <windows.h>
#else
#   include <sys/time.h>
#endif
#ifdef WIN32
int
gettimeofday(struct timeval *tp, void *tzp)
{
    time_t clock;
    struct tm tm;
    SYSTEMTIME wtm;
    GetLocalTime(&wtm);
    tm.tm_year     = wtm.wYear - 1900;
    tm.tm_mon     = wtm.wMonth - 1;
    tm.tm_mday     = wtm.wDay;
    tm.tm_hour     = wtm.wHour;
    tm.tm_min     = wtm.wMinute;
    tm.tm_sec     = wtm.wSecond;
    tm. tm_isdst    = -1;
    clock = mktime(&tm);
    tp->tv_sec = clock;
    tp->tv_usec = wtm.wMilliseconds * 1000;
    return (0);
}
#endif
 

方案二:

gettimeofday的使用

//copy from muduo
Timestamp Timestamp::now()
{struct timeval tv;gettimeofday(&tv, NULL);//返回1970年至今的秒+微秒int64_t seconds = tv.tv_sec;return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);
}

gettimeofday要求传入一个timeval和一个时区。因为存在微秒数,显然它比 time_t now = ::time(NULL)更精确。

但是这个函数是linux下的。所以我们需要一个跨平台的实现。

以下是一个实现,使用c++的chrono库。

#include <chrono>
int gettimeofday(struct timeval *__restrict __tv, __timezone_ptr_t __tz)
{
auto now = std::chrono::system_clock::now();
auto now_ticks = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());//
__tv->tv_sec = (long)now_ticks.count() / 1000000;
__tv->tv_usec = (long)now_ticks.count() % 1000000;
return 0;
}
now.time_since_epoch()返回的duration比较奇怪,需要转化成微秒。其实主要是windows没有这个函数,那么我们实现它。
//copy from evpp
#ifdef WIN32
int gettimeofday(struct timeval* tp, void* tzp) {uint64_t  intervals;FILETIME  ft;GetSystemTimeAsFileTime(&ft);/** A file time is a 64-bit value that represents the number* of 100-nanosecond intervals that have elapsed since* January 1, 1601 12:00 A.M. UTC.** Between January 1, 1970 (Epoch) and January 1, 1601 there were* 134744 days,* 11644473600 seconds or* 11644473600,000,000,0 100-nanosecond intervals.** See also MSKB Q167296.*/intervals = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime;intervals -= 116444736000000000;tp->tv_sec = (long)(intervals / 10,000,000);tp->tv_usec = (long)((intervals % 10000000) / 10);return (0);
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记(45):Python实战编程-键盘事件

立即学习:https://edu.csdn.net/course/play/19711/343107?utm_sourceblogtoedu 1.键盘事件&#xff1a;按键松开或者按下触发事件的执行&#xff0c;一般组件要绑定键盘事件都是同时绑定按键松开&#xff08;“”<KeyRelease>&#xff09;和按键按下&#xff08;“<…

JSDoc那些事

几天工作上需要文档化一些Javascript东西&#xff0c;所以在找一些JS文档化工具&#xff0c;以下分析几种工具。 1.JSDoc-toolkit 一开始还想用这个工具&#xff0c;但后来在解析生成文档时候&#xff0c;出现了很严重的错误&#xff0c;还存在其他问题。 问题1&#xff1a;闭包…

onBlur事件与onfocus事件(js)

onFocus事件就是当光标落在文本框中时发生的事件。 onBlur事件是光标失去焦点时发生的事件。 可以编如下例子 1.html <HTML> <HEAD> <TITLE>使用onBlur事件处理程序</TITLE> </HEAD> <BODY BGCOLOR"lavender"> <FORM name&qu…

谈论Java原子变量和同步的效率 -- 颠覆你的生活

我们认为&#xff0c;由于思维定式原子变量总是比同步运行的速度更快&#xff0c;我想是这样也已经&#xff0c;直到实现了ID在第一次测试过程生成器不具有在这样一个迷迷糊糊的东西。测试代码&#xff1a; import java.util.ArrayList; import java.util.List; import java.ut…

总结从linux - windows 上(GCC与MSVC 2015) 移植C或者C++代码时候遇到的编译和链接问题

解决办法和修改办法的总体思想 1、在代码的语义和功能不变的情况下&#xff0c;进行c->c的转变&#xff0c;消除编译器的跨平台编译报错问题&#xff1b; 2、遇到编译问题&#xff0c;先看编译器提示信息&#xff0c;然后逐个排查和定位&#xff0c;去解决问题。 1、当遇到…

1 week110的zookeeper的安装 + zookeeper提供少量数据的存储

下面是在weekend110上的zookeeper的安装 在此之前&#xff0c;先进行快照备份。 在这里&#xff0c;为了后续的zookeeper配置需要&#xff0c;在/home/hadoop/下&#xff0c;新建data目录&#xff0c;再新建zookeeper-3.4.6目录&#xff0c;再新建zkdata目录。 默认情况下&…

学习笔记(46):Python实战编程-protocol

立即学习:https://edu.csdn.net/course/play/19711/343108?utm_sourceblogtoedu 1.protocol协议&#xff1a;主要用于窗体关闭监听&#xff0c;通过这个协议可以在窗体关闭前提示是否真的要关闭&#xff0c;这样可以防止用户误触导致数据的丢失 2.关键代码 #----------------…

linux yum命令详解

yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软体包…

linux配置Java环境变量(详细)

一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录&#xff0c; 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议&#xff0c;连继敲回车&#xff0c;当询问是否同意的时候&#xff0c;输入yes&#xff0c;回车。之后会在当前目录下生成一个jdk1.…

在c++代码中关闭和启动另外一个pid进程号,共享内存数据使用

char * of_program_name "./AB"; 1、 pid getPidFromName(of_program_name); if (pid > 0) { ERROR("AB process still exispid %d\n", pid); if (kill(pid, SIGKILL)) //杀死进程 { fprintf(std…

提速XP操作系统

1、加速网上邻居 在Windows XP中访问网上邻居是相当恼人的&#xff0c;系统会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务&#xff0c;然后才显示出来&#xff0c;显然这样速度就会比Windows 9x中慢很多。其实这些功能我们并没有使用上&…

学习笔记(47):Python实战编程-pack布局

立即学习:https://edu.csdn.net/course/play/19711/343109?utm_sourceblogtoedu pack布局&#xff1a; 1&#xff09;最常用的布局&#xff0c;顺序排列布局方法 2&#xff09;完成了简单的组件位置码放&#xff0c;但如果内部布局处理机制跟不上的话&#xff0c;也可能会达…

ASP.NET Web API 应用教程(一) ——数据流使用

相信已经有很多文章来介绍ASP.Net Web API 技术&#xff0c;本系列文章主要介绍如何使用数据流&#xff0c;HTTPS&#xff0c;以及可扩展的Web API 方面的技术&#xff0c;系列文章主要有三篇内容。 主要内容如下&#xff1a; I 数据流 II 使用HTTPS III 可扩展的Web API 文档…

JAVA类的构造方法

1,构造方法没有返回类型, 定义: []public] 方法名() {} 2,一个构造方法如果想调用同一类中的另一个构造方法,只能调用一个,并且要放在构造方法第一行 3,用this调用,如 1 public person(int i, int j) { 2 this(); //调用另一个构造方法,且放在第一行 3 } 转载于:https://www…

将字符串和数字合并动态写入

sprintf(tmpTime, "/media/AIlog/%02d_%02d_%.txt",100,200);

windows安装64位Pygame方法

因为官方网站http://www.pygame.org/download.shtml并没有提供64位的pygame&#xff0c;所以要找其他网站制作的64位安装文件。 如果你已经在你的64位开发环境中安装了32位的pygame&#xff0c; 那么在导入pygame包的时候&#xff0c; 会有提示&#xff1a; ImportError: DLL l…

学习笔记(48):Python实战编程-grid布局

立即学习:https://edu.csdn.net/course/play/19711/343110?utm_sourceblogtoedu grid布局&#xff1a;根据表结构进行的布局&#xff0c;索引为0行0列开始&#xff0c;最具代表性的即使电脑计算器的数字和符号按键布局 组件.grid(row 行索引号 &#xff0c; column 列索引号…

为什么“三次握手,四次挥手”?

前言&#xff1a; 如果你说你懂IT,你懂计算机网络&#xff0c;那么你会怎么解释“三次握手&#xff0c;四次挥手”&#xff1f; ---------------- 1.TCP报文段首部格式&#xff1a; 2.TCP建立连接图 -------------------------------------------- 符号说明 seq:"sequance…

学习笔记(49):Python实战编程-place布局

立即学习:https://edu.csdn.net/course/play/19711/343111?utm_sourceblogtoedu 1.place布局&#xff1a; 1&#xff09;最灵活的布局方式&#xff0c;是根据坐标点来进行组件的位置布局的 2&#xff09;确定坐标点后&#xff0c;组件从坐标点开始展开&#xff0c;即以指定…

cobbler基础安装

epel源安装rpm -ivh epel-release-6-8.noarch.rpmyum -y install cobbler httpd rsync tftp-server xinetd dhcp cobbler-web koan pykickstart* fence-agents* debmirror syslinux$$$$$$$$$$$启动cobbler服务/etc/init.d/cobblerd start$$$$$$$$启动httpd服务/etc/init.d/http…