Im Hintergrund laufendes Programm - QTimer?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo, ich habe einen Programm, welches sich am systemstart startet und dann alle drei Stunden eine Datenbank checken soll und gegebenenfalls eine Notification zeigt.

Ich hatte mir das mit dem QTimer gedacht, jedoch wollte ich nochmal Fragen, ob das sinnvoll ist oder ob es andere, bessere Lösungen gibt(Plattform-unabhängig ). Wie schaut das mit den Ressourcen aus?
Liebe Grüße
lunar

@Trubinial Guru: So pauschal kann man auch nicht mehr dazu sagen, als dass man "QTimer" benutzen kann, möglicherweise aber – je nach Datenbank und Umgebung – auch andere Lösungen in Betracht kommen könnten. "QTimer" jedenfalls ist wie Qt selbst plattformunabhängig. Die Frage bezüglich Ressourcen erschließt sich mir nicht. Was meinst Du damit?
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Ok, vielen Dank das hat meine Frage schon beantwortet :D
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Ich habe mich für die QTimer Methode entschieden und alles scheint soweit gut zu laufen.
Nun bin ich aber auf ein Problem gestoßen, bei dem ich keine Ahnung habe, wie ich es lösen kann.

Ich benutze Inno Setup zum erstellen einer Installationsdatei. Seitdem ich den QTimer benutze kommt die Meldung, dass eine Datei (die PyQt Core dll) nicht ersetzt werden kann, da nicht die nötigen Rechte vorhanden sind.
Das liegt wohl daran, dass im Hintergrund noch das Programm läuft, welches sich ja beim Systemstart automatisch entfernt. Selbes Problem tritt auch bei der Deinstallation auf.

Ich konnte leider keine Lösung finden. Hat jemand eine Idee?
lunar

@Trubinial Guru: Du kannst den Nutzer entweder durch einen Dialog darauf hinweisen, dass Deine Anwendung vor der Installation beendet werden muss, oder Du ersetzt beziehungsweise löscht die entsprechenden Dateien nach einem Reboot. Ob InnoSetup eine dieser Möglichkeiten direkt unterstützt, kann ich nicht sagen, ich habe InnoSetup nie verwendet.. Zumindest letzteres aber muss ein brauchbarer Installer imho unterstützen.

Ohnehin ist davon abzuraten, etwas anderes als Windows-Installer zu verwenden. Windows Installer ist einfach der de-facto-Standard, und wird von Microsoft selbst am besten unterstützt. Mithilfe von WiX kannst Du solche Pakete aus XML-Beschreibungen erzeugen. Dank des auf der Website verlinkten Tutorials ist der Einstieg auch nicht allzu schwer. WiX selbst integriert sich in Visual Studio, alternativ kannst Du #develop verwenden, oder zur Not auch einen beliebigen XML-Editor.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hey, ich habe einige Abende für WIX geopfert und habe auch einen gut funktionierenden Installer erstellt aber nachdem ich einige Erfahrung mit WIX gemacht, habe bin ich jetzt doch wieder auf Inno Setup umgestiegen.
Ich bin mit WIX unheimlich unzufrieden: Man kommt sich vor als würde man mit Kanonen auf Tauben schießen und es gibt so unheimlich viele Stellen an denen es durch kleine Fehler zu großen Problemen kommen kann. Ich finde WIX ist unheimlich unbequem und unnötig kompliziert.
Da meine Erfahrungen mit Inno Setup bis jetzt aber astrein waren und ich bis jetzt niemanden kenne, der mit meinen Installationsdateien Probleme hatte und man sogar Installationsdateien mit Multilanguage support erstellen kann, bin ich mit meiner Entscheidung zufrieden und konnte sogar eine Lösung finden:

Besser gesagt gibt es zwei Lösungen:
Die wohl bessere Lösung ist es die von Inno Setup zur Verfügung gestellten Funktionen zur Erkennung laufender Prozesse zu benutzen. So kann man zum beispiel einen zusätzlichen Dialog erstellen, welcher einen auffordert ein Programm zu schließen, sollte das für die Installation notwendig sein. Infos darüber gibts auf folgenden Seiten (und den darin enthaltenen verlinkungen):
http://www.vincenzo.net/isxkb/index.php ... is_running
http://www.vincenzo.net/isxkb/index.php ... is_running

Die zweite Möglichkeit, für die ich mich entschieden habe, da der Prozess bei mir im Hintergrund läuft, ist, dass man eine zusätzliche .exe erstellt, welche den jeweiligen Prozess beendet und diese exe vom Installer ausführen lässt, bevor die eigentliche Installation startet. Dazu habe ich folgenden Code zu meinem Inno Setup Script hinzugefügt:

Code: Alles auswählen

procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: integer;
begin
  if Exec(ExpandConstant('{app}\killReminder.exe'), '', '', SW_SHOW,
     ewWaitUntilTerminated, ResultCode) then
  begin
    // handle success if necessary; ResultCode contains the exit code
  end
  else begin
    // handle failure if necessary; ResultCode contains the error code
  end;

end;
Vorausgesetzt ist natürlich, dass ich diese exe bereits im Installationsordner ist - damit das auch so ist, sollte man sie in den Installer integrieren.

In der Hoffnung, dass es jemandem hilft...
Antworten