Я разрабатываю и компилирую на RedHat 7.4 с GCC 4.8.5 и Qt 4.8.5. Код должен быть статически связан. Затем выполняется на виртуальной машине под управлением Scientific Linux версии 6.7. memcpy-Wrap используется для предотвращения зависимостей от более новой версии GLIBC >= 2.4.
У меня есть следующий MWE:
#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-System с
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:
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 наблюдается следующее поведение:
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-System готовый сигнал из рабочего потока подключается к выходному слоту в основном приложении. Кажется, этого не происходит в Scientific-Linux-System. Есть ли у кого-нибудь совет, почему это происходит и как я могу это отладить?
QCoreApplication::quit
вы можете подключиться кlambda
, который вызываетQCoreApplication::quit
, что позволит вам добавить дополнительный диагностический вывод. - person G.M.   schedule 04.04.2018Qt4
. Это исключаетlambda
, но функция, которая вызываетQCoreApplication::quit
, будет служить той же цели. - person G.M.   schedule 04.04.2018Qt::DirectConnection
. Я предполагаю, что ваш сигнал испускается, но слот не вызывается, потому чтоqtApplication.exec();
блокирует основной цикл событий. - person vahancho   schedule 04.04.2018