什么是后30毫秒C中的经过时间退出循环的最佳出路++

什么是退出循环接近30毫秒尽可能在C ++中的最佳出路。 轮询提升:microsec_clock? 轮询QTIME? 别的东西?

就像是:

A = now; for (blah; blah; blah) { Blah(); if (now - A > 30000) break; }

它应该可以在Linux,Mac OS X和Windows。

循环中的计算是用于更新仿真。 每30毫秒,我想更新视口。

--------------解决方案-------------

在这个环节相当多的代码片断例如你想要做什么:

http://www.cplusplus.com/reference/clibrary/ctime/clock/

从他们的榜样改编:

void runwait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait)
{
/* Do stuff while waiting */
}
}

循环中的计算是用于更新仿真。 每30毫秒,我想更新视口。

你有没有考虑过用线程? 你描述的似乎是为什么你应该使用线程,而不是定时器的完美典范。

主进程线程一直走的是UI的关怀,有一个QTimer的设置为30毫秒进行更新。 它锁定一个QMutex能够访问的数据,执行更新,并且释放互斥。

第二个线程(见的QThread)做模拟。 对于每个周期,将锁定QMutex,莫非计算和释放互斥当数据是在一个稳定的状态(适于在UI更新)。

随着多核心处理器增加的趋势,你应该想到越来越多地使用线程比使用定时器。 你的应用程序自动受益于新的处理器的功率增加(多核心)。

虽然这并不能回答这个问题,可能会给再来看一看解决方案。 怎么样把仿真代码和用户界面在不同的线程? 如果您使用Qt,定期更新可以使用定时器,甚至的QThread :: msleep()来实现。 您可以调整螺纹曼德尔布罗例如,以满足您的需要。

如果你需要做的工作,直到一定的时间已经过去,那么docflabby的答案是当场上。 但是,如果你只需要等待,什么都不做,直到指定的时间已过,那么你应该使用usleep()

简短的回答是:你不能在一般情况下,但如果你是在正确的操作系统,或在合适的硬件上运行就可以了。

你可以得到接近30毫秒使用在Intel系统的组件调用和别的其它架构的所有操作系统的。 我会来挖了参考和编辑的答案,包括代码,当我找到它。

问题是时间切片算法,以及如何接近你的时间片结束时,你是一个多任务操作系统。

在一些实时操作系统的,有一个在系统库,你可以做一个系统调用,但我不知道那是什么电话会。

编辑:LOL! 有人已经发布一个类似的片段上SO:http://stackoverflow.com/questions/275004/c-timer-function-to-provide-time-in-nano-seconds

VonC得到了与它的CPU定时器汇编代码的注释。

根据您的问题,每30毫秒你想更新视口。 我写了一个类似的应用程序一旦探测到硬件的每500毫秒类似的东西。 尽管这并不直接回答你的问题,我有以下followups:

  • 你肯定布拉赫(),用于更新视口,可以在不到30毫秒的每个实例执行?
  • 似乎更像是运行布拉赫()将完成由计时器回调更好。
  • 这是很难找到一个图书馆计时器对象,将推动在30毫秒的时间间隔做了一个图形框架的更新。 在Windows XP中我发现,标准的Win32 API计时器,计时器的时间间隔到期后推窗消息,即使在2GHz的P4,不能做任何的更新速度比一个300毫秒的时间间隔,无论多么低我设置的时间间隔上计时器。 虽然有在Win32 API中提供高性能定时器,他们有很多的限制,即,你不能像你上面提到的一个循环做任何的IPC(如更新UI组件)。
  • 基本上,结果是你必须非常仔细地规划你想怎么有更新的发生。 您可能需要使用线程,看看要如何更新视口。

只是有些事情要考虑。 他们抓住我的惊讶,当我的工作我的项目。 如果您已经通过已经想到这些事情,请忽略我的回答:0)。

你可能会考虑只更新视每N模拟步骤,而不是每K毫秒。 如果是这样(说)一个严重的商业应用程序,那么你可能会想要去别的地方多线程的路线建议,但如果(说),它是为个人或有限的观众使用的,哪些是你真正感兴趣是什么它是细节你模仿,那么每-N-步骤很简单,便携,很可能是不够好要与过得好。

见QueryPerformanceCounter和QueryPerformanceFrequency的

如果您使用的是Qt,这里有一个简单的方法来做到这一点:

QTimer* t = new QTimer( parent ) ;
t->setInterval( 30 ) ; // in msec
t->setSingleShot( false ) ;
connect( t, SIGNAL( timeout() ), viewPort, SLOT( redraw() ) ) ;

你需要指定viewPortredraw() 然后启动定时器t->start()

分类:C# 时间:2012-01-01 人气:0
本文关键词: QT,C#,定时器,时钟
分享到:

相关文章

  • 如何创建一个jQuery时钟/定时器 2012-08-30

    我有一个简单的测验应用程序,我想在页面的顶部,显示用户多久,他们已经去为显示一个不错的定时器/时钟. (如果我能以某种方式向他们展示一个计时器共有测验时间,也是第二个对于这个提问时间,这将是更酷,但我应该能够找出如何做自己,一旦我得到了一个定时器的工作. 我的问题是: 什么是一个不错的,简单的方法来显示一个简单的定时器/时钟使用JQuery? (直JS也行),我知道如何检查的时间,但我如何才能递增秒? 我自己的搜索保持领先我的jQuery插件(我想推出自己的),也有"事件计时器",这不

  • 什么是写在C / C ++的定时器最简单的方法? 2014-05-23

    什么是写在C / C ++的定时器最简单的方法? 嗨, 什么是写一个计时器,说在C / C ++最简单的方法? 以前我用一个for循环和do-whil​​e循环. 我用for循环计数器和do-whil​​e循环,作为"时间尽头"的比较. 该方案担任我想它,但消耗太多的系统资源. 我正在寻找写定时器最简单的方法. 谢谢! 编辑: 该项目工程在一组服务器,Linux和Windows的,所以这是一个多平台环境. 我不想用unsleep或休眠功能,因为我想写一切从头开始. 该项目的性质:本项目

  • 从标准输入使用Qt异步读取 2012-09-03

    我想从使用Qt标准输入读取异步. 我不希望使用一个单独的线程或必须设置一个定时器,以定期检查,如果该文件描述符的数据. 我怎样才能做到这一点? --------------解决方案------------- 如果你读了Qt文档,它说你不能这样做,因为它是不可移植的. 为什么不使用TCP套接字应工作假设你有超过另一端的控制. 最坏的情况下你可以做一个代理应用程序. 如果你想整合标准输入/输出/标准错误I /与QT事件循环0,您可以: 使用在QSocketNotifier和做I / O自己read(

  • 我可以在Visual Studio 2010中混合Qt和非Qt的项目? 2013-11-25

    我们有一组用C ++编写的Windows DLL文件是由一个C#应用程序使用,而所有这一切都是在Visual Studio解决方案包裹起来. 现在有人已经移植的DLL来的Qt,使他们可以在其他操作系统中使用. 我可以切换到Qt代码我的解决方案中,并继续把它与C#应用程序工作? 或将我必须一​​分为二的解决方案? 我试着已经这样做了,但是当我尝试建立我得到的错误 "该操作无法完成,参数不正确" 要么 "因为建正在进行中无法执行请求的操作" 仅供参考,我使用VS2010

  • 如何检测Qt的Windows事件? 2014-11-15

    我想建立一个应用程序来检测到Windows事件,涉及到多媒体特定事件(播放视频,播放音频和图像). 例如,如果Windows媒体播放器被打开时,相关的事件应被检测出来. --------------解决方案------------- 没有'事件'了点. 您可以检测的媒体播放器lauches(由WINAPI :: FindWindow函数)或图像查看器. 我不认为这是可能的QT内置的独函数来做到这一点. 你将不得不使用Windows API. 根据什么你真的想这样做可以得到相当复杂. 如果你只是想

  • 如何分析在Linux上我的C ++应用程序 2012-01-20

    我想配置文件在Linux上我的C ++应用程序. 我想找出多少时间我的应用程序中花费的CPU处理通过IO /闲置的块与时间花费. 我知道有在Linux上轮廓刀具调用Valgrind的. 但它打破了时间花费在每一种方法,它不给我用了CPU的处理VS闲置多少时间的总体情况? 或者是有办法做到这一点与Valgrind的. --------------解决方案------------- 我可以推荐valgrind结合的callgrind工具KCacheGrind调试的可视化. KCacheGrind调试

  • 蓝光数码拷贝在Windows 7 2012-08-04

    所以,我在几个星期前我升级的Windows Vista到Windows 7. 所有的精彩作品; 不过,我与我的蓝光DVD的数字拷贝的问题. 所有我在升级之前必须仍然是数字拷贝做工精细. 这是我要复制到我的硬盘这就是给我任何问题,新的数字拷贝. 贺电说,我需要有Windows XP或以上转移副本. 有没有人有并解决这个问题? --------------解决方案------------- 尝试运行用于盘翻录在兼容硬盘的软件. 右键单击程序的可执行文件>点击下面的"兼容模式"属性&g

  • QT4拖动窗口没有标题栏 2013-09-30

    我工作的应用程序有要求我从主窗口中删除标题栏自定义用户界面. 不幸的是,我无法弄清楚如何使它这样我就可以在屏幕上移动的应用程序:) 我有被删除的标题栏的代码如下: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent, Qt::CustomizeWindowHint), ui(new Ui::MainWindowClass) { ui->setupUi(this); 任何想法如何,我可以移动窗口使用或是其他的Widget或主窗体

  • 未定义的引用`stdscr上“ 2013-12-16

    我试图编译我的代码在Ubuntu 11.10和谷歌搜索它,我认为这是一个错误链接获得这些错误和more.So远. 具体来说,有建议,以确保你有正确的标题和链接-lncurses库. 我已经做到了. 我仍然收到此错误. 我也看了,可能是我应该安装的libncurses,但我已经安装了. My MakeFile: CPP = g++ CPPFLAGS = -c -Wall -g LINK = g++ LDFLAGS_LINUX = -lpthread -lncurses LDFLAGS = $(LD

  • 在Ruby中工作线程 2014-05-29

    我写一个简单的记忆游戏使用红宝石+ QT(试图摆脱C ++的同时...) 为了让X秒超时查看两个开放片,我需要或者定时器或做的工作在后台线程. 什么是执行这一不重新发明轮子的最简单的方法? Ruby的线程? Qt的线程? Qt的定时器? --------------解决方案------------- 我不知道这是否是最好的解决办法,但是: block=Proc.new{ Thread.pass } timer=Qt::Timer.new(window) invoke=Qt::BlockInvoc

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.507 (s). 10 q(s)