그래서 마침내 나는 답을 찾지 못한 이상한 문제를 발견했습니다.
작은 GUI를 만들고 별도의 창에서 응용 프로그램을 시작한 다음 qtimer를 사용하여이 응용 프로그램의 상태를 폴링합니다.
process_timer = new QTimer(this);
connect(process_timer, SIGNAL(timeout()), this, SLOT(checkFlashProcess()));
process_timer->start(100);
그래서 이것은 작동합니다. 그러나 매번 새 타이머를 생성하지 않기 때문에 GUI 생성자에 process_timer 생성을 배치했습니다.
Flasher::Flasher(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Flasher)
{
ui->setupUi(this);
process_timer = new QTimer(this);
}
이제 충돌과 출력이 발생합니다. QObject :: connect : Cannot connect (null) :: timeout () to Flasher :: checkFlashProcess ()
이것도 동일합니다.
Flasher::Flasher(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Flasher),
process_timer(new QTimer)
{...
QTimer * process_timer는 애플리케이션 헤더에 정의되어 있습니다.
또한 process_timer를 비 동적으로 정의하려고 시도했습니다.
header.h:
QTimer process_timer;
code.cpp
void Flasher::on_flashButton_clicked()
{
(...)
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, process_pid );
if(hProcess)
{
qDebug() << "Got handle for process!";
connect(&process_timer, SIGNAL(timeout()), this, SLOT(checkFlashProcess()));
process_timer.start(30);
}
이것은 또한 충돌로 이어집니다.
콜백 :
void Flasher::checkFlashProcess()
{
qDebug() << "Got handle for process!";
}
그러나 이것은 왜? 타이머는 생성자에서 생성되지 않지만 생성자에서 객체를 생성하는 것은 문제가되지 않을까요? 그리고 왜 정적 버전이 충돌할까요? 이것이 같은 문제일까요?
좋아, 이것은 qtimer와 관련이 없지만 메모리 문제인 것 같습니다. 나는 Windows에서 프로세스 핸들을 얻는 방법을 많이 찾고 있었고 대부분 유닉스에 대한 소스를 찾았습니다. 그런 다음 이 두 가지 사이에서 나는 일이 섞여서 메모리의 타이머 바로 전에 배치 된 것처럼 보이는 process_pid에 DWORD를 사용하여 끝났습니다. 따라서 openprocess를 호출하면 손상이 발생하고 충돌이 발생했습니다. 응용 프로그램을 시작한 후 타이머를 생성하면 타이머를 다시 복원하여 "수정"했습니다.
또 다른 교훈을 얻었으며 qProcess에서 OpenProcess까지 pid에 qint64를 사용하면 잘 작동합니다. 바라건대 다른 누군가가 비슷한 일을하려고 할 때 이것을 발견하고 번거 로움을 피할 수 있기를 바랍니다. 문제를 분리하기 위해 mcve를 만들어 주셔서 감사합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다