given_to_fly Geschrieben 26. August 2004 Geschrieben 26. August 2004 Hallo, ich benutze die XSleep Funktion XSleep Dies funktioniert auch wunderbar doch obwohl ich meine Anwendung mit dem x oder über den menüpunkt schliessen , beende bleibt der prozess im hintergrund weiter aktiv und belegt ressourcen :-( was muss ich in meinen coding noch einfügen damit dies nicht mehr passiert? Ich habe eine MFC Anwendung im VC++6. Ich denke mal das ich den Prozess auch beenden muss aber wie? Desweiteren noch eine kleine Frage... Ich habe eine Methode der Klasse ProgDlg diese heist ProgDlg::runcmd ich möchte den Aufruf dieser Methode in den Hintergrund legen und wenn ich die Awendung schliesse wieder killen... wie geht das? Zitieren
Guybrush Threepwood Geschrieben 26. August 2004 Geschrieben 26. August 2004 Irgendwie verstehe ich den Sinn der Funktion xSleep nicht, warum nimmst du nicht Sleep? Zitieren
given_to_fly Geschrieben 26. August 2004 Autor Geschrieben 26. August 2004 Irgendwie verstehe ich den Sinn der Funktion xSleep nicht, warum nimmst du nicht Sleep? Weil ich ein paar Probleme mit der normalen Sleep funktion habe, z.B. aktualisiert sich meine GUI nicht. Bzw. die Ausgabefelder auf der GUI werden nicht mit werten angezeigt. obwohl ich werte setze. Das BMP das ich anzeigen lassen will wird nicht angezeigt... Also habe ich eine Funktion gebraucht die meine messages trotzdem noch anzeigt , und das macht eben XSleep... Zitieren
given_to_fly Geschrieben 26. August 2004 Autor Geschrieben 26. August 2004 Irgendwie verstehe ich den Sinn der Funktion xSleep nicht, warum nimmst du nicht Sleep? Auf jedenfall muss ich den Prozess wieder irgendwie beenden können, sonst läuft das Programm ewig im Hintergrund und belegt Ressourcen (und das nicht wenig...) Kannst du mir helfen? Zitieren
FighterFigger Geschrieben 26. August 2004 Geschrieben 26. August 2004 Dann solltest du vielleicht das, was schlafen soll in einen eigenen Thread packen. Auf den hast du dann volle Kontrolle durch den Handler und den Thread legst du immer brav, früh ins Bett mit Sleep. Da Sleep deinen anderen Thread schlafen läßt, aber nicht deinen Haupt-GUI-Thread, kann der fein weiterarbeiten. Wird die GUI geschlossen muß sie vorher noch ihren Sohn killen, der eben noch schläft. Solch ein Konzept wäre doch einfacher ... oder? Der Thread, der schlafen soll ... was tut der? Berechnet der was oder ist er auch für eine GUI-Funktionalität? Zitieren
given_to_fly Geschrieben 26. August 2004 Autor Geschrieben 26. August 2004 Dann solltest du vielleicht das, was schlafen soll in einen eigenen Thread packen. Auf den hast du dann volle Kontrolle durch den Handler und den Thread legst du immer brav, früh ins Bett mit Sleep. Da Sleep deinen anderen Thread schlafen läßt, aber nicht deinen Haupt-GUI-Thread, kann der fein weiterarbeiten. Wird die GUI geschlossen muß sie vorher noch ihren Sohn killen, der eben noch schläft. Solch ein Konzept wäre doch einfacher ... oder? Der Thread, der schlafen soll ... was tut der? Berechnet der was oder ist er auch für eine GUI-Funktionalität? Das Problem ist das es eigentl. kein Thread ist der schlafen soll, sondern ein Schleifendurchlauf x Sekunden warten soll. Das liegt daran da das Programm zyklisch Daten über ein Serielles Interface bzw. einen Ordner pollt und dies in der Schleife noch weitere logische Verzweigungen hat (was ist wenn Gerät an Seriell etwas erkannt hat etc..) von daher schläft eigentlich kein thread sondern eher der schleifendurchlauf soll x Sekunden warten. Der Sleep-Befehl ist in einer Methode die sowohl GUI Funktionalität als auch "Aktionenen" ausführt. Zitieren
FighterFigger Geschrieben 26. August 2004 Geschrieben 26. August 2004 Aber gerade das ist, was ich Designtechnisch anders machen würde. (ohne zu wissen, ob das dort möglich ist und ohne dir bei XSleep zu helfen) Du könntest eben diese Polling-SchleifenFunktion als Thread aufmachen indem du sie static deklarierst und du darauf CreateThread anwendest. Dann kann die schlafen oder wachen, wann immer sie will. Nun braucht sie nur noch eine Möglichkeit, aktiv die GUI zu verändern. Entweder mit einem Pointer auf den Dialog, oder auf eine Callback Funktion oder ähnliches ... Du könntest theoretisch doch auch die Ergebnisse in einen gemeinsamen Speicher schreiben und per Message der GUI sagen, daß da neue Daten sind. Ich meine nur, daß du das tatsächlich in 2 Threads teilst und damit dann keine Probleme mehr hast. :beagolisc Zitieren
given_to_fly Geschrieben 26. August 2004 Autor Geschrieben 26. August 2004 Aber gerade das ist, was ich Designtechnisch anders machen würde. (ohne zu wissen, ob das dort möglich ist und ohne dir bei XSleep zu helfen) Du könntest eben diese Polling-SchleifenFunktion als Thread aufmachen indem du sie static deklarierst und du darauf CreateThread anwendest. Dann kann die schlafen oder wachen, wann immer sie will. Nun braucht sie nur noch eine Möglichkeit, aktiv die GUI zu verändern. Entweder mit einem Pointer auf den Dialog, oder auf eine Callback Funktion oder ähnliches ... Du könntest theoretisch doch auch die Ergebnisse in einen gemeinsamen Speicher schreiben und per Message der GUI sagen, daß da neue Daten sind. Ich meine nur, daß du das tatsächlich in 2 Threads teilst und damit dann keine Probleme mehr hast. :beagolisc Hallo, es wäre möglich, jedoch nur mit vermehrten Aufwand :-( den ich jetzt nicht mehr aufbringen kann. Ich habe mir jetzt mal das Coding von dem XSleep angeschaut und habe mir folgendes überlegt in der XSleep.cpp ist folgende Coding Zeile die einen Thread erzeugt CreateThread(NULL, 0, &XSleepThread, &sleep, 0, &threadId); Ich gehe mal davon aus das dieser es ist der auch zum schluss noch bestehen bleibt obwohl das Programm beendet wurde.. Wenn ich mir nun den Wert von threadId in einer variablen merke und mir diese in einen protected wert schreibe auf den ich von überall zugreifen kann (z.B. vom Dialog), und dann bei beendigung meines programmes nochmal ein Kommando absetze das den Thread killt geht das? Welches Kommando wäre das? Oder gibt es vllt. sogar ein Kommand mit dem ich mir alle Prozesse hole die Programm.exe heissen und diese dann beende? Wenn ja wäre ich für beispielcode sehr dankbar :-) In welchem Ereigniss muss ich dies dann noch ausführen, damit es beim schliessen der GUI ausgeführt wird? Danke :hodata Zitieren
FighterFigger Geschrieben 27. August 2004 Geschrieben 27. August 2004 Also mit TerminateThread kriegst du den definitiv weg. Das wäre mal ein Versuch wert, allerdings: Erstellt er bei jedem Schleifendurchlauf einen neuen Thread, ohne den wieder zu entfernen? Das glaube ich nicht wirklich, denn XSleep kann ja dann abschließen, wenn er genug gewartet hat. Außerdem weiß ich nicht, warum ein Thread bestehen bleiben sollte, wenn der Vater-Prozeß terminiert. Aber hast du dir schonmal das hier in Bezug auf diesen Artikel durchgelesen? Vielleicht übernimmst du seinen Vorschlag. Zitieren
given_to_fly Geschrieben 27. August 2004 Autor Geschrieben 27. August 2004 Also mit TerminateThread kriegst du den definitiv weg. Das wäre mal ein Versuch wert, allerdings: Erstellt er bei jedem Schleifendurchlauf einen neuen Thread, ohne den wieder zu entfernen? Das glaube ich nicht wirklich, denn XSleep kann ja dann abschließen, wenn er genug gewartet hat. Außerdem weiß ich nicht, warum ein Thread bestehen bleiben sollte, wenn der Vater-Prozeß terminiert. Aber hast du dir schonmal das hier in Bezug auf diesen Artikel durchgelesen? Vielleicht übernimmst du seinen Vorschlag. Hi, ich hab den code von ihm probiert aber er bringt kompilierungsfehler error C2660: 'KillTimer' : Funktion akzeptiert keine 1 Parameter Fehler beim Ausführen von cl.exe. Woher bekomme ich den Handle den ich für den TerminateThread Befehl benötige... Ich glaube es liegt einfach daran das er noch wartet und den Thread erstellt hat und nicht zum beenden davon kommt , da ich das Programm beende und so der Thread stehen bleibt. Kannst du mir mal nen funktionsfähigen TerminateThread Code für die XSleep Funktion posten. Kann ich irgendwie auch sagen wenn ich auf schliessen klicke kille alle Prozesse die dem Vaterprozess gehören? So kann ich auf jedenfall sicher gehen das der Prozess wegfliegt ohne das ich ihn bei jedem Schleifenaufruf terminieren muss Zitieren
given_to_fly Geschrieben 27. August 2004 Autor Geschrieben 27. August 2004 Args, habs zum laufen bekommen, es hat aber keinen Erfolg gebracht, der Prozess bleibt weiter bestehen. Er beendet sich einfach nicht obwohl ich die GUI schliesse. Zitieren
given_to_fly Geschrieben 27. August 2004 Autor Geschrieben 27. August 2004 problem behoben, die grafik war zwar weg aber die endlosscheife ist weiter gelaufen... habe das mit dem button behoben... danke! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.