首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跨平台sleep,msleep,usleep兼容性问题

跨平台sleep,msleep,usleep兼容性问题

作者头像
Qt君
发布2019-08-01 11:27:39
3.8K0
发布2019-08-01 11:27:39
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

写Linux应用时用到睡眠函数,比如sleep,usleep,但是将应用移植到Windows系统却是编译错误。本文解决Linux与Windows睡眠函数的兼容性问题。

1.宏替换实现

  • 使用Qt的Q_OS_WIN32宏识别系统,读者可以改用其他宏来识别系统。
  • Windows系统的Sleep睡眠函数单位是毫秒。
  • Linux系统的sleep睡眠函数单位是秒。
  • 使用宏扩展出msleep睡眠函数单位是毫秒。
#include <QCoreApplication>

#ifdef Q_OS_WIN32
#include <windows.h>
#define sleep(sec)   Sleep(sec * 1000)
#define msleep(msec) Sleep(msec)
#else
#include <unistd.h>
#define msleep(msec) usleep(msec * 1000)
#endif

2.关于Windows下的usleep

  • 在Windows系统下使用微秒睡眠,实际用处不大,一般API调用都几微秒了。
  • 有好过没有,万一有一天可能会用到。
static void usleep(unsigned long usec)
{
    HANDLE timer;
    LARGE_INTEGER interval;
    interval.QuadPart = -(10 * usec);

    timer = CreateWaitableTimer(NULL, TRUE, NULL);
    SetWaitableTimer(timer, &interval, 0, NULL, NULL, 0);
    WaitForSingleObject(timer, INFINITE);
    CloseHandle(timer);
}

3.兼容实现

#include <QCoreApplication>

#ifdef Q_OS_WIN32
#include <windows.h>
#define sleep(sec)   Sleep(sec * 1000)
#define msleep(msec) Sleep(msec)

static void usleep(unsigned long usec)
{
    HANDLE timer;
    LARGE_INTEGER interval;
    interval.QuadPart = -(10 * usec);

    timer = CreateWaitableTimer(NULL, TRUE, NULL);
    SetWaitableTimer(timer, &interval, 0, NULL, NULL, 0);
    WaitForSingleObject(timer, INFINITE);
    CloseHandle(timer);
}
#else
#include <unistd.h>
#define msleep(msec) usleep(msec * 1000)
#endif

int main(int argc, char *argv[])
{
    sleep(1);
    msleep(100);
    usleep(1000);
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.宏替换实现
  • 2.关于Windows下的usleep
  • 3.兼容实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档