c++ - QThread 发出 finished() 信号但 isRunning() 返回 true 而 isFinished() 返回 false

标签 c++ qt gps blackberry-10 qthread

下面是我的 qthread 实现的代码。我正在尝试从卫星获取 gps 数据。即使程序退出 gpsSearch() 槽函数,QThread 也不会产生 finished() 信号。每当单击按钮时,都会调用函数 locateMe()。第一次线程未启动并单击按钮时,它为 isRunning() 函数打印真值,为 isFinished() 函数打印假值。我不得不调用 QTherad 的 quit() 函数来手动停止线程。之后它转到 gnssProvider 类中连接的 threadQuit() 函数。但即使在那之后,如果我单击按钮,它也会在 locateMe() 函数中为 isRunning 打印真值,为 isFinished() 打印假值。

GPSInfo::GPSInfo()
{
    hybridGPSFound = satelliteGPSFound = networkGPSFound = false;
    qDebug()<<"Thread Creating";
    gnssThread = new QThread;
    gnssProvider = new LocationFetcher(this,GEOLOCATION_PROVIDER_GNSS,1);
    gnssProvider->moveToThread(gnssThread);
    connect(gnssThread, SIGNAL(started()), gnssProvider, SLOT(gpsSearch()));
    connect(gnssThread, SIGNAL(finished()), gnssProvider, SLOT(threadQuit()));
}
void LocationFetcher::gpsSearch()
{
    if (BPS_SUCCESS != geolocation_request_events(0))
    {
       fprintf(stderr, "Error requesting geolocation events: %s", strerror(errno));
       return;
    }
    geolocation_set_provider(GPS_Search_Provider);
    geolocation_set_period(GPS_Search_Period);
    while (!stopThread)
    {
        bps_event_t *event = NULL;
        bps_get_event(&event, -1);

        if (event)
        {
            if (bps_event_get_domain(event) == geolocation_get_domain() && bps_event_get_code(event) == GEOLOCATION_INFO)
            {
                handle_geolocation_response(event);
                break;
            }
        }
    }
    geolocation_stop_events(0);

    this->quit();

}
void GPSInfo::LocateMe()
{
    qDebug()<<"Thread Running: "<<gnssThread->isFinished();
    qDebug()<<"Thread Running: "<<gnssThread->isRunning();

    gnssThread->start();
    hybridThread->start();
    networkThread->start();

 }

最佳答案

QThread 生命周期的工作方式是这样的:

  1. 您调用 QThread::start()
  2. 此时,isRunning() 应该开始返回 true。
  3. 线程内部开始。它们发出 started() 信号。
  4. 线程内部调用run()
  5. 除非您在子类中覆盖它,否则 run() 会调用 exec()
  6. exec() 进入一个事件循环并停留在那里直到 quit()exit() 被调用。
  7. exec()run() 返回内部。
  8. 此时,isFinished() 应该开始返回 true 而 isRunning() 应该返回 false。
  9. 内部发出 finished() 信号。
  10. 内部人员进行一些最后的清理工作。
  11. 线程真正终止。

因此您需要在位置 getter 完成后调用 quit() - 但 this->quit() 并未调用 quit() 在线程上!这可能就是它什么也没做的原因。

您的代码看起来有点像仿照本文设计的:

http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

注意她是如何给她的 worker 一个finished()信号(与QThread::finished不同)并将它连接到QThread::quit () 插槽。

关于c++ - QThread 发出 finished() 信号但 isRunning() 返回 true 而 isFinished() 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045368/

相关文章:

c++ - FlatBuffers 中的多个根表

c++ - atomic<T*> 总是无锁的吗?

C++ 模板元编程 : find out if variadic type list contains value

c++ - Qt5 VS 2010 - QtSerialPort 库失败

python - 如何使用Qt Delegates进行自定义绘画?

c# - 使用 C# 在 MySQL 上以半径存储和获取位置

c++ - cout 的缓冲区如何工作?

c++ - Qt C++ 创建一个所有类都可以访问的全局变量

node.js - 使用地理位置确定哪些用户与某个用户接近

ios - 通过 GPS 提高测量距离的准确性