Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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

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?

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?

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.

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

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

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.

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

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.

problem behoben, die grafik war zwar weg aber die endlosscheife ist weiter gelaufen...

habe das mit dem button behoben... danke!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.