我有以下代码:
#ifdef Q_OS_WIN32
Sleep(25);
#endif
写在Windows上的Qt。我知道之前编译过的代码,但由于某种原因,现在它说Sleep并未在此范围内声明。必须有一些解决方法,而无需添加
#include "windows.h"
任何经验/建议都会很棒!!
答案 0 :(得分:1)
如果通过Qt提供了一个特定于平台的调用,则不应该使用特定于平台的调用,因此在这种情况下,您可能应该使用QThread :: msleep。
为了回答你之前为什么有效,而不是现在的问题,我猜你在某一点上包含的一些标题包含的内容比应该包含的多得多,并且在Qt 5中被清理了。这可能会令人沮丧,但是从长远来看,最有可能是有益的。
答案 1 :(得分:1)
必须有一些解决方法,而无需添加
你需要包含它的官方MSDN documentation says,所以请不要避免它。
这是一个很好的做法,总是明确你的依赖关系,以避免隐藏的依赖性问题,当一些包含的头文件不再帮助你透明地包含你的依赖项时,它可能随时爆发。
这可能就是这里发生的事情,你的某些依赖关系清理了库,不包含不必要的东西,或者它只是在内部重新设计。
或者,此功能在WinBase.h
之前已根据文档提供,现在如果您切换到较新的Windows,它也可能会出现隐藏依赖项的问题。
要学习的经验教训是,即使您所包含的其他标题中包含的最简单的函数,您也希望明确。
但是,您需要了解
之间的区别#ifdef Q_OS_WIN32
#include "windows.h"
#endif
和
#ifdef Q_OS_WIN32
#include <windows.h>
#endif
在这种情况下,您应该使用后者而不是前者,因为后者将用于此类系统标头,而前者通常用于项目中的“本地”标头。
话虽这么说,你应该避免在你的Qt应用程序中使用WinAPI。 QThread或QtTestLib模块已经提供了这种功能。
void QThread::msleep(unsigned long msecs) [static]
强制当前线程休眠msecs毫秒。
和
睡眠毫秒,阻止执行测试。 qSleep()不会执行任何事件处理并使您的测试无响应。睡觉时网络通信可能会超时。使用qWait()进行无阻塞睡眠。
ms必须大于0.
注意:qSleep()函数在unix上调用nanosleep()或在窗口调用Sleep(),因此在qSleep()中花费的时间精确度取决于操作系统。
示例:
QTEST :: qSleep(250);
使用Qt 4,您需要在子类中覆盖QThread的受保护睡眠方法并使用它。使用Qt 5,您可以直接使用它,因为它是为了避免公共子类要求API而公开的。