Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben
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...

Geschrieben
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?

Geschrieben

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?

Geschrieben
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.

Geschrieben

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

Geschrieben
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

Geschrieben

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.

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...