QT c++ 프로그램 자동 업데이트 관련 질문 드립니다.

pogusm의 이미지

mainProgram.exe 을 실행시키면 먼저 http를 통해 업데이트가 존재하는지 체크하여
업데이트가 없다면, 계속 프로그램을 진행하고
업데이트가 존재한다면, 자신(mainProgram.exe)을 종료시키고 update.exe 를 실행시킵니다.

(질문1. 자신을 종료시키고 다른 프로그램을 실행시키는 방법이 궁금합니다)

update.exe 는 http를 통해 "newProgram.zip.exe(자동압축해제프로그램)" 파일을 다운로드 받아
1. newProgram.zip.exe 를 실행시키고
2. newProgram.zip.exe 의 실행이 종료되었음을 감지하면
3. 자신(update.exe)을 종료시키고 mainprogram.exe 를 실행시킵니다.

(질문2. newProgram.zip.exe 의 실행의 종료를 감지하는 방법이 궁금합니다)

안그래도 초보인데 오랜만에 해보려니까 막막하네요 ㅠㅠ

감사합니다.

pogusm의 이미지

(질문2. newProgram.zip.exe 의 실행의 종료를 감지하는 방법이 궁금합니다) - 이건 QProcess::finished 으로 가능할거 같습니다.

추가질문..
(질문3. A.exe 프로그램에서 B.exe 를 실행시키고, B.exe 에서 A.exe 를 종료시키는것도 방법도 궁금합니다)

klyx의 이미지

QProcess 클래스를 활용해보세요.

pogusm의 이미지

빠른 응답 감사합니다.
그런데 직접 해보질 않아서 의문이 드는데
자신을 kill 하는 명령을 내리고
그 다음줄에 다른프로그램을 실행시키는 명령을해도 되는건가요?

그리고 자신을 실행시킨 부모 프로그램을 죽이는 방법은... 가능한건가요?

(추가)

void MainWindow::on_pushButton_clicked()
{
	QApplication::quit();
	QProcess *myProcess = new QProcess();
	myProcess->start("qprocess02.exe");
}

위 처럼 하니까 자신프로그램은 죽고 qprocess02.exe 은 잘 실행되네요..
(신기하네요... 나를 죽이는 명령이 먼저인데도 잘된다는게..)

klyx의 이미지

QProcess::startDetached()를 찾아보세요.
더불어서 quit()은 kill하는 함수가 아닙니다. 메인 이벤트루프를 종료시키는 함수입니다.

pogusm의 이미지

답변감사합니다.
그런데
QProcess *myProcess = new QProcess();
myProcess->start("qprocess02.exe");
위처럼 사용하면 QProcess::startDetached 와 같은 효과가 있는거 아닌가요?

start 와 startDetached 의 정확한 차이점을 잘 모르겠습니다..
(startDetached 를 이용해서, 자신을 실행시킨 부모를 종료시키는 방법도 잘 모르겠습니다
조금 더 도움을 주시면 감사하겠습니다)

그리고
quit() 이 kill 하는 함수가 아니라면...
QApplication::quit(); 라고 자신을 종료시키는 방법 말고 다른 방법을 사용해야 하는 것인가요?

klyx의 이미지

"자신을 실행시킨 부모를 종료시키는 방법"은 없습니다.
또한 이경우에는 필요도 없습니다. 필요하면 프로세스간 통신으로 종료하게끔 약속해서 신호를 보내면되겠죠.

start()로 실행한 프로세스는 해당 QProcess 객체가 삭제되면 비정상적으로 종료될수 있습니다.
플랫폼에 따라서도 다를듯하네요.

메인 이벤트 루프란 QApplication의 exec() 함수안을 가리킵니다.
quit()을 부르면 qApp->exec()가 종료됩니다.
그후에 어떻게 되는지는 main 함수를 어떻게 짰느냐의 문제입니다.
quit()으로 프로그램을 종료시키려면 exec() 종료후에 아무것도 안하고 main함수를 리턴하면 되겠죠.

pogusm의 이미지

답변 감사합니다
대략 어떻게 되는건지 이해가 되네요.

감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.