그래, QTimer에서 완전히 잃어 버렸어. 문제는 다음과 같습니다. 다중 스레드 응용 프로그램이 있으며 QTimer의 시간 초과 작업이 필요합니다. 나는 이렇게했다 :QTimer in multithreaded application
QTimer* timer = new QTimer();
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), someObject, SLOT(work()));
그리고 이것은 작동하지 않았다. 가끔 work()가 전혀 호출되지 않았고, 프로그램을 닫을 때 호출되는 경우가 있었으며, 때로는 모두 정상적으로 보였습니다.
그래서 타이머에 스레드가 필요하다는 생각이 들었습니다. MCV 예를 들면 :
class Tester : public QObject
{
Q_OBJECT
public:
Tester(QObject* par = 0) : QObject(par)
{
}
public slots:
void greet()
{
qDebug()<<"hello";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTimer* timer1 = new QTimer();
QThread* thread = new QThread();
Tester* tester = new Tester();
timer1->setInterval(500);
timer1->setSingleShot(false);
timer1->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), timer1, SLOT(start()));
QObject::connect(timer1, SIGNAL(timeout()), tester, SLOT(greet()));
QObject::connect(timer1, SIGNAL(timeout()), timer1, SLOT(deleteLater()));
QObject::connect(timer1, SIGNAL(destroyed()), thread, SLOT(quit()));
thread->start();
thread->wait();
delete thread;
delete tester;
return a.exec();
}
그리고이 예제는 아무 것도하지 않습니다. 그것은 나에게 인사하지 않기 때문에 시간 제한은 호출되지 않으며 종료되지 않으므로 스레드가 중지되지 않습니다. 질문은 다음과 같습니다.
1.이 코드의 문제점은 무엇입니까?
2. 멀티 스레드 환경에서 QTimer를 올바르게 사용하는 방법은 무엇입니까?
신중 QObject를이 : ((스레드, SIGNAL (시작 연결 코드를 읽어 보시기 바랍니다)), timer1, SLOT (start())); 아니면 내가 틀렸어? – DoctorMoisha
@DoctorMoisha 네 말이 맞아. 내 편집 내용을 확인하십시오. – Iuliu
감사합니다.하지만 메모리 누수를 방지하기 위해 어떻게해야합니까? – DoctorMoisha