首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt-信号在虚拟机中未连接

Qt-信号在虚拟机中未连接
EN

Stack Overflow用户
提问于 2018-04-04 17:54:58
回答 2查看 101关注 0票数 3

我在RedHat 7.4上使用GCC 4.8.5和Qt 4.8.5进行开发和编译。代码必须是静态链接的。然后在运行release版本6.7的虚拟机上执行。使用memcpy-Wrap是为了防止对较新的GLIBC >= 2.4的依赖

我有以下MWE:

代码语言:javascript
复制
#include <iostream>
#include <unistd.h>
#include <QtCore>
#include <QThread>

__asm__(".symver memcpy, memcpy@GLIBC_2.2.5");
extern "C" {
void *__wrap_memcpy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
}

class Worker : public QThread {
    void run() {
        std::cout << "WORKER: Started." << std::endl;
        QObject::connect(this, SIGNAL(finished()), QCoreApplication::instance(), SLOT(quit()));
        int i=0;
        while(i++<3) {
            std::cout << "WORKER: I am running." << std::endl;
            usleep(1e6);
        }
        std::cout << "WORKER: Finished." << std::endl;
    }
};

int main(int argc, char** argv) {

    std::cout << "MAIN: Init QCoreApplication" << std::endl;
    QCoreApplication qtApplication(argc, argv);

    std::cout << "MAIN: Init Worker" << std::endl;
    Worker myWorker;
    myWorker.start();

    std::cout << "MAIN: Start Event-Loop." << std::endl;
    qtApplication.exec();

    std::cout << "MAIN: Event-Loop finished." << std::endl;
    return 0;
}

这段代码是在RedHat系统上编译的

代码语言:javascript
复制
g++ -I$QTD/mkspecs/linux-g++ -I$QTD/include -I$QTD/include/QtCore -o mwe mwe.cpp  -Wl,--wrap=memcpy -L$QTD/lib/ -lQtCore -lQtNetwork -lglib-2.0 -lrt -lpthread -ldl -lz

$QTD存放我安装的Qt-4.8.5的位置。

在Red-Hat-System上预期和观察到以下行为:

代码语言:javascript
复制
MAIN: Init QCoreApplication
MAIN: Init Worker
MAIN: Start Event-Loop.
WORKER: Started.
WORKER: I am running.
WORKER: I am running.
WORKER: I am running.
WORKER: Finished.
MAIN: Event-Loop finished.

在Scientific Linux-System上观察到以下行为:

代码语言:javascript
复制
MAIN: Init QCoreApplication
MAIN: Init Worker
MAIN: Start Event-Loop.
WORKER: Started.
WORKER: I am running.
WORKER: I am running.
WORKER: I am running.
WORKER: Finished.

然后应用程序永远不会结束。

似乎在Red-Hat系统中,来自工作线程的finished信号被连接到核心应用程序中的quit-slot。这似乎不会在科学Linux系统中发生。有没有人有任何建议,为什么会发生这种情况,以及如何调试它?

EN

回答 2

Stack Overflow用户

发布于 2018-04-04 18:24:14

你必须以正确的方式使用QThread。重载run()函数是不安全的,诺基亚之前接受了它,并展示了如何使用QThread。

Look at this documentation

票数 0
EN

Stack Overflow用户

发布于 2018-04-04 19:24:12

正如前面提到的-在Qt中不推荐使用线程的方式。但这对你的情况很好。无论如何,我建议您尝试下一种方法:

代码语言:javascript
复制
class Worker : public QThread {
    Q_OBJECT // Don't forget this macro
    void run() {
        std::cout << "WORKER: Started." << std::endl;
        // QObject::connect(this, SIGNAL(finished()), QCoreApplication::instance(), SLOT(quit()));
        int i=0;
        while(i++<3) {
            std::cout << "WORKER: I am running." << std::endl;
            usleep(1e6);
        }
        std::cout << "WORKER: Finished." << std::endl;
        this->deleteLater();
    }
};

int main(int argc, char** argv) {

    std::cout << "MAIN: Init QCoreApplication" << std::endl;
    QCoreApplication qtApplication(argc, argv);

    std::cout << "MAIN: Init Worker" << std::endl;
    Worker *myWorker = new Worker();
    QObject::connect( myWorker, SIGNAL(destroyed()), &qtApplication, SLOT(quit());
    myWorker->start();

    std::cout << "MAIN: Start Event-Loop." << std::endl;
    qtApplication.exec();

    std::cout << "MAIN: Event-Loop finished." << std::endl;
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49648042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档