皮皮网

【乌托邦源码】【oa订货系统源码】【单页面asp源码】usleep 源码

来源:复制源码 时间:2024-11-24 22:27:39

1.如何让 Qt 的程序使用 Sleep
2.linux中如何实现sleep(0)的功能
3.C语言俄罗斯方块游戏解析
4.如何让 Qt 程序 Sleep
5.ORB-SLAM2 的源码编译运行(ubuntu20.04)以及ROS1安装

usleep 源码

如何让 Qt 的程序使用 Sleep

       Qt 为何没有提供 Sleep

       è®ºå›ä¸Šä¸æ—¶è§åˆ°æœ‰äººé—®ï¼š

       Qt 为什么没有提供跨平台的 sleep 函数?

       ä½¿ç”¨å¹³å°ç›¸å…³çš„ Sleep 或 nanosleep 以后,界面为什么没有反应?

       QThread 中提供了protected 权限的 sleep 函数,如何用到主线程中?

       ä½¿ç”¨ QTest 中的 qSleep,在windows下如何隐藏控制台?

       è¿™äº›é—®é¢˜å…¶å®žå½’结为一点:在主线程中使用这些函数是一种错误,这会直接导致界面无法刷新,用户与程序无法交互。

       Qt不提供,是因为你不需要在主线程中使用 sleep 函数。

       å¦‚何让程序等待一段时间

       QTime

       QTime t;

       t.start();

       while(t.elapsed()<);

       è¿™ç§æ­»å¾ªçŽ¯ä¹Ÿæ˜¯ä¸€ç§å¸¸è§é”™è¯¯ç”¨æ³•ã€‚但改成正确的还是比较简单的:

       QTime t;

       t.start();

       while(t.elapsed()<)

        QCoreApplication::processEvents();

       ä¸åœåœ°å¤„理事件,以使得程序保持响应。

       QElapsedTimer

       è¿™æ˜¯Qt4.7引入的新的类,和QTime相比,它提供了更快的计算 elapsed 时间的方法。

       QElapsedTimer t;

       t.start();

       while(t.elapsed()<)

        QCoreApplication::processEvents();

       QTest::qWait

       è¿™æ˜¯QTest模块提供的等待函数

       ä¸‹é¢æ˜¯å…¶æºä»£ç ï¼ˆå’Œæˆ‘们前面的代码很像吧?):

       namespace QTest

       {

        inline static void qWait(int ms)

        {

        Q_ASSERT(QCoreApplication::instance());

        QElapsedTimer timer;

        timer.start();

        do {

        QCoreApplication::processEvents(QEventLoop::AllEvents, ms);

        QTest::qSleep();

        } while (timer.elapsed() < ms);

        }

       ...

       å…¶å®žæ²¡ä»€ä¹ˆé­”力,对吧?但是因为它QTest模块,所以在程序中我们不要使用它。

       QEventLoop

       é…åˆQTimer使用局部的 eventLoop 也是一个不错的选择。例子:

        QEventLoop eventloop;

        QTimer::singleShot(, &eventloop, SLOT(quit()));

        eventloop.exec();

       QTimer 和 QBasicTimer

       è¿™ä¸¤ä¸ªå’Œæœ¬æ–‡æ²¡æœ‰ä»€ä¹ˆç›´æŽ¥å…³ç³»ï¼ŒQTimer估计大家都很熟了。而QBasicTimer估计很少有人用。

       ä¸ŽQTimer相比,QBasicTimer更快速、轻量、底层。

       ä¸ŽQTimer相比,它不是QObject的派生类。

       è·¨å¹³å°çš„sleep

       å°½ç®¡ä¸€å¼€å§‹æˆ‘们就说了,不需要这个东西。但不排除某种场合下,你确实需要这个东西。如何实现一个跨平台的 sleep 呢?

       æˆ‘们一开始也提到了,QThreadç±» 和 QTest模块都提供了sleep函数,其实我们只需要看看他们的源码就够了:

       QTest 模块中的函数很简单(windows下调用Sleep,其他平台调用 nanosleep):

       void QTest::qSleep(int ms)

       {

        QTEST_ASSERT(ms > 0);

       #ifdef Q_OS_WIN

        Sleep(uint(ms));

       #else

        struct timespec ts = { ms / , (ms % ) * * };

        nanosleep(&ts, NULL);

       #endif

       }

       çœ‹QThread的源码,windows下同样直接调用Sleep,但非windows的实现比这个就复杂多了:

       [cpp] view plain copy

       /* /internal

        helper function to do thread sleeps, since usleep()/nanosleep()

        aren't reliable enough (in terms of behavior and availability)

       */

       static void thread_sleep(struct timespec *ti)

       {

        pthread_mutex_t mtx;

        pthread_cond_t cnd;

        pthread_mutex_init(&mtx, 0);

        pthread_cond_init(&cnd, 0);

        pthread_mutex_lock(&mtx);

        (void) pthread_cond_timedwait(&cnd, &mtx, ti);

        pthread_mutex_unlock(&mtx);

        pthread_cond_destroy(&cnd);

        pthread_mutex_destroy(&mtx);

       }

       void QThread::sleep(unsigned long secs)

       {

        struct timeval tv;

        gettimeofday(&tv, 0);

        struct timespec ti;

        ti.tv_sec = tv.tv_sec + secs;

        ti.tv_nsec = (tv.tv_usec * );

        thread_sleep(&ti);

       }

linux中如何实现sleep(0)的功能

       å‰æ®µæ—¶é—´ä»Žwindows移植了一个程序到linux上,不知为何性能奇差。查了下原因,发现是由于一个函数ZeroSleep特别耗时,这个函数的代码很简单,如下:

       void ZeroSleep()

       {

        Sleep(0);

       }

       Sleep(0)作用是用来释放cpu的时间片,避免忙等待。于是想当然的在linux上实现为:

       void ZeroSleep()

       {

        msleep(0);

       }

       ä½†å…¶å®žmsleep API的源代码如下:

       void msleep(unsigned int msecs)

       {

        unsigned long timeout = msecs_to_jiffies(msecs) + 1;

        while (timeout)

        timeout = schedule_timeout_uninterruptible(timeout);

       }

       å¦‚此一来,即使参数为0,也至少要睡眠一个jiffies单位的时间,因此导致严重的性能问题。

       è¯¥é—®é¢˜çš„解决方法是:

       æ—¢ç„¶ZeroSleep的目的是释放cpu资源,那么就可以通过调用schedule()函数替换msleep 。而且实际上msleep本身也是通过调用schedule_timeout_uninterruptible实现的,所以这个做法也是合理的。

       d;pthread_mutex_init(&mtx, 0);pthread_cond_init(&cnd, 0);pthread_mutex_lock(&mtx); (void) pthread_cond_timedwait(&cnd, &mtx, ti);pthread_mutex_unlock(&mtx);pthread_cond_destroy(&cnd);pthread_mutex_destroy(&mtx);}voidQThread::sleep(unsignedlongsecs){ structtimevaltv;gettimeofday(&tv, 0);structtimespecti;ti.tv_sec = tv.tv_sec + secs;ti.tv_nsec = (tv.tv_usec * );thread_sleep(&ti);}

ORB-SLAM2 的编译运行(ubuntu.)以及ROS1安装

       在 Ubuntu . 环境中,编译并运行 ORB-SLAM2 需要一系列的源码准备工作和库的安装。首先,源码确保已安装了所需的源码依赖项,然后按照指定链接从 GitHub 下载并安装 Pangolin-0.6 稳定版。源码乌托邦源码

       接着,源码oa订货系统源码进行 OpenCV-3.4.5 的源码安装,包括下载、源码配置编译环境和查询版本信息以验证安装是源码否成功。对于 Eigen3,源码建议源码安装默认的源码 Eigen 版本(3.3.9),并将其头文件复制到相应目录以确保正常工作。源码若需要使用特定版本(如3.3.7),源码单页面asp源码需手动安装并调整位置。源码

       在编译 ORB-SLAM2 时,源码需处理常见的报错,例如在 `System.h` 中添加 `#include` 以解决 `usleep` 报错,雷电飞机java源码并根据特定链接调整 `LoopClosing.h` 文件中的代码以解决第二个报错。第三个报错需删除 `CMakeCache.txt` 文件并重新执行 `cmake ..` 和 `make` 命令。

       成功编译后,需在特定目录下运行 ORB-SLAM2,启明指标源码确保使用正确的终端打开以找到可执行文件。此外,安装 ROS1 可以通过一键安装工具完成,注意管理日志目录的大小以避免警告。在安装完成后,启动 ROS Master、小海龟仿真器和海龟控制节点,以验证 ROS1 是否已成功安装。

       安装过程中可能遇到的问题包括 ROS 目录的位置和库查找问题,以及如何在编译 ORB-SLAM2 时指定依赖目录。通过将 ROS 目录添加到环境变量(如 `PYTHONPATH` 或 `LD_LIBRARY_PATH`)中,可以解决这些问题并确保库的正确查找。