Qt定时器只能用于QThread启动的线程
Qt -Timers can only be used with threads started with QThread
代码为
class ExampleTest : public QObject
{
Q_OBJECT
public:
ExampleTest() {}
private Q_SLOTS:
void DoAllExampleTests();
};
void ExampleTest::DoAllExampleTests()
{
QProcess p;
p.start( "cmd /c wmic path Win32_usbcontrollerdevice|grep VID_1004" );
qDebug() << "Here 1";
QVERIFY( TRUE == p.waitForFinished() );
qDebug() << "Here 2";
}
QTEST_APPLESS_MAIN(ExampleTest);
我在这里1和这里2之间得到一个qwarn
QObject::startTimer: Timers can only be used with threads started with QThread
我从QObject::startTimer中学到:计时器只能与QThread开始的线程使用,当我子类一个Qt类和子类的成员之一不是Qt层次结构的一部分。我有继承自QObject的ExampleTest类,但仍然得到警告。如何避免这种警告?
该警告可以使用更好的措辞——这不是QThread问题,而是事件循环问题。QThread会自动为你设置一个,但是这里你只有一个主线程。
有两种方法在主线程中创建事件循环:- 用QEventLoop 手动创建一个
- 使用QApplication(或其子类)为您创建一个
大多数应用程序将使用选项2。但是,您正在编写单元测试。单元测试没有运行QApplication的原因是您指定了QTEST_APPLESS_MAIN。引用文档:
实现一个main()函数,该函数执行TestClass中的所有测试。
的行为类似于QTEST_MAIN(),但是不实例化QApplication对象。使用这个宏进行非常简单的独立非gui测试。
我特别强调。所以你要做的就是把最后一行改成
QTEST_APPLESS_MAIN(ExampleTest);
:
QTEST_MAIN(ExampleTest);
…这样问题就解决了。
相关文章:
- 使用 std::string () const 函数启动线程或未来
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 使用 std::thread & std::bind 在成员函数中启动线程
- GDB 输出启动线程,但给出输出
- 尝试在我的基类中启动线程时,Visual Studio 由于调试错误而中止我的程序
- 启动线程会导致指针初始化时出现分段错误
- OMP 不启动线程
- 在关闭时升级登录中的启动线程访问违规
- 如何在dllmain中启动线程
- 如何使用媒体基础在给定时间运行/启动线程
- 如何在另一个核心上启动线程而不将处理器亲和力设置为特定核心
- Qt多线程启动线程错误
- 在构造函数中使用"this"启动线程是安全的?
- 停止,然后启动线程
- C++/Win32 我在 Windows 2000+ 上启动线程的最佳方式
- 如何在事件发生时启动线程并严格关闭其句柄
- 从 Poco::HTTPServer 启动线程
- 在成员函数上启动线程时不需要的析构函数调用
- C++线程库,在完成前两个线程后启动线程
- 使用父窗口在对象中启动线程