anderer prozess unterbricht meine anwendung
-
Hi, ich hab ne anwendung geschrieben, die ununterbrochen arbeitet. und dies auch soll. Wenn ich jetzt aber eine andere anwendung starte ( getestet: Counter-Strike), dann hat meine anwendung alle paar sekunden starke aussetzer! Wenn ich die Prozesspriorität hochsetze, ändert sich nichts, ausser das Counter-Strike tierisch ruckelt.
-
Das bringen Multitasking-Betriebssysteme halt so mit sich, dass sie die Rechenzeit zwischen mehreren Prozessen aufteilen. Wenn dein Prozess exklusiv laufen soll, musst du ein entsprechendes OS verwenden.
Wenn ich die Prozesspriorität hochsetze, ändert sich nichts, ausser das Counter-Strike tierisch ruckelt
Wie sollte es sich denn deiner Vorstellung nach verhalten?
-
pock schrieb:
Das bringen Multitasking-Betriebssysteme halt so mit sich, dass sie die Rechenzeit zwischen mehreren Prozessen aufteilen. Wenn dein Prozess exklusiv laufen soll, musst du ein entsprechendes OS verwenden.
Wenn ich die Prozesspriorität hochsetze, ändert sich nichts, ausser das Counter-Strike tierisch ruckelt
Wie sollte es sich denn deiner Vorstellung nach verhalten?
nunja, ich hätte erwartet, dass mein programm dann flüssig läuft ?
edit: des weiteren ist das, was mein przess macht nicht besonders aufwendig...ich hätte erwartet, dass das parallel einigermaßen flüssig laufen würde
-
Was heist denn flüssig laufen? Was macht denn dein Programm? Erzähl mal bissel mehr

schirrmie
-
eigentlich sollte das auch laufen. Meine Firewall sagt ja auch net alle 5sek "So jetzt mach ich mal Pause"^^
Oft lässt sich die benötigte Systemleistung auch noch runterschrauben. Musst den Code halt nochmal durchgehen (besonders die Schleifen). Manchmal sind nur wenige Zeilen, die eigentlich überflüssig (oder halt gekürzt werden können), die dann aber bei einer Schleife, die alle 20ms ausgeführt, doch was verändern kann.
mfg killsmaker
-
pixartist schrieb:
Wenn ich jetzt aber eine andere anwendung starte ( getestet: Counter-Strike), dann hat meine anwendung alle paar sekunden starke aussetzer!
Probier mal ein "Sleep (0);" in der Hauptschleife der Anwendung.
-
ich poste mal den code hier:
#include "stdafx.h" #include <stdio.h> #include <windows.h> int main(int argc, char* argv[]) { int d = 0; while(d == 0) { POINT mp; GetCursorPos(&mp); HRGN rg = CreateRectRgn(mp.x, mp.y+5, mp.x+1, mp.y+6); HDC hdcScreen = GetDCEx(NULL, rg, DCX_INTERSECTRGN); COLORREF p = GetPixel(hdcScreen,mp.x,mp.y+5); //printf("%i, %i, %i \n", GetRValue(p), GetGValue(p), GetBValue(p)); if(GetRValue(p) > 10 && GetGValue(p) <= 0 && GetBValue(p) <= 0) { mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Sleep(5); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } Sleep(1); } return 0; }vorallem sind die "pausen" ziemlich unregelmäßig lang Oo
-
N' Abend
,also erstmal: LOL, was ist dat denn ?^^
pixartist schrieb:
// ... int d = 0; while(d == 0) { // ...
?
Falls das ne Endschlosschleife sein soll, lässt sich das doch einfacher mitwhile(true) { /*...*/ }realisieren
.Du solltest die Definitionen aller Variablen aus der Schleife nehmen, das frisst Performance.
Wie hast Du denn die Priorität angehoben ?Und was noch viel wichtiger ist: Schonmal was von aufräumen gehört
?
ReleaseDC, DeleteObject
(siehe MSDN)Nochwas am Rande:
EinSleep(0);sorgt dafür, dass die gesamte restliche, dem aktuellen Thread zur Verfügung stehenden Rechenzeit abgegeben wird.
PS: Warum die Prozess-Priorität hochsetzen und dann mit Sleep arbeiten, doch irgendwie widersprüchlich
.
-
pixartist schrieb:
... dann hat meine anwendung alle paar sekunden starke aussetzer!
Was genau meinst Du mit "starke Aussetzer" ?
-
naja..wenn ich innerhalb der schleife was ausgeben lasse, dann kommt das exteem unregelmässig...mal n paar sekunden ganz normal schnell hinternander..danna ne halbe sekunde nix..dann wieder normal...dann 2 sekunden nix usw.
aber wie gesagt nur wenn counter-strike an ist.
-
Probier erst mal so :
... HRGN rg = CreateRectRgn(mp.x, mp.y+5, mp.x+1, mp.y+6); HDC hdcScreen = GetDCEx(NULL, rg, DCX_INTERSECTRGN); while(d == 0) { ... // HRGN rg = CreateRectRgn(mp.x, mp.y+5, mp.x+1, mp.y+6); // <- aus schleife raus // HDC hdcScreen = GetDCEx(NULL, rg, DCX_INTERSECTRGN); // <- aus schleife raus ... Sleep(1); }Falls das nicht klappt, ist das Problem eine Nummer grösser.
-
Erstmal ja, alles was nicht in der Schleife sein muss -> raus.
Und dann: mach ein "Sleep(10)" aus dem "Sleep(1)", und dann pack ein "timeBeginPeriod(1)" vor die Schleife.
Dann noch die Priorität hochsetzen, und gut.
Viel mehr kannst du nicht machen.
Wenn du nebenbei flüssig CS spielen willst musst du eben zusehen dass das was du in der Schleife dann alle 10ms machst eben nicht lange dauert
BTW: wenn du mit CreateRectRgn eine region machst, solltest du die mit DeleteObject wieder löschen. Wenn nicht wundert mich nicht dass dann alle paar Sekunden mal Pause ist und dass CS daneben feste ruckelt... du müllst ja den ganzen Speicher mit regions voll. Und eben: aus der Schleife raus, Objekte (wie ne region) anlegen und zerstören ist nicht gerade "billig".
-
lol, sagmal hast Du meinen Post überhaupt gelesen...

PS:
hustbaer schrieb:
Und eben: aus der Schleife raus, Objekte (wie ne region) anlegen und zerstören ist nicht gerade "billig".
Da die Region aber abhängig vom der aktuellen Cursorposition ist (so sieht der Code zum mindestens aus^^), geht das nit, aber GDI-Clean-Up hab ich ja schon lange geschrieben...
.
-
.
-
Huh?!
PS: @hustbear, also das
CodeFinder schrieb:
lol, sagmal hast Du meinen Post überhaupt gelesen...

war nicht auf Dich, sondern auf pixartist bezogen
.
-
Ok, hab' ich mal blödsinn geschrieben, passiert.
Andrerseits: in dem Fall sollte man wohl besser SetRectRgn verwenden anstatt dauernd eine neu zu machen und wider zu zerstören, hm? Also doch Create/Delete aus der Schleife raus

Dass du DeleteObject schon erwähnt hast hab ich überlesen.
BTW: was du zu Sleep(0) schreibst ist "falsch". Sleep(0) gibt den Rest einer Zeitscheibe ab, allerdings nie an Prozesse mit niedrigerer Priorität. Was wichtig ist. Mitunter sehr.
PS: Warum die Prozess-Priorität hochsetzen und dann mit Sleep arbeiten, doch irgendwie widersprüchlich
Nein, ist es überhaupt nicht. Wenn ich etwas alle 10ms machen möchte, aber möglichst niemals länger als 10ms warten (typischer polling fall eben), dann setze ich die Priorität hoch und warte dann mit Sleep. Vollkommen logisch, und genau der Fall um den es hier geht.
PS: ich hatte das auf mich bezogen

-
hustbaer schrieb:
Andrerseits: in dem Fall sollte man wohl besser SetRectRgn verwenden anstatt dauernd eine neu zu machen und wider zu zerstören, hm? Also doch Create/Delete aus der Schleife raus

Jupp, dat stimmt, sollte ajf schneller sein.
hustbaer schrieb:
BTW: was du zu Sleep(0) schreibst ist "falsch". Sleep(0) gibt den Rest einer Zeitscheibe ab, allerdings nie an Prozesse mit niedrigerer Priorität. Was wichtig ist. Mitunter sehr.
Jupp, sagen wir nit falsch, sondern unvollständig^^... aber hast Recht, wusste ich nicht ->
.hustbaer schrieb:
PS: Warum die Prozess-Priorität hochsetzen und dann mit Sleep arbeiten, doch irgendwie widersprüchlich
Nein, ist es überhaupt nicht. Wenn ich etwas alle 10ms machen möchte, aber möglichst niemals länger als 10ms warten (typischer polling fall eben), dann setze ich die Priorität hoch und warte dann mit Sleep. Vollkommen logisch, und genau der Fall um den es hier geht.
Damit hat sich das erübrigt ... da ich wie gesagt Vorheriges nicht wusste, ergab sich darin auch kein Sinn für mich...jetzt allerdings schon, danke
!PS: Hätte jetzt fast auf Deinen nicht-editierten Post geantwortet
... ^^
-
hhmm also mein code sieht jetzt so aus:
#include "stdafx.h" #include <stdio.h> #include <windows.h> #include <ctime> int main(int argc, char* argv[]) { HDC hdcScreen; //timeBeginPeriod(1); while(true) { POINT mp; GetCursorPos(&mp); hdcScreen = GetDC(0); COLORREF p = GetPixel(hdcScreen,mp.x,mp.y+5); // printf("%i, %i, %i \n", GetRValue(p), GetGValue(p), GetBValue(p)); if(GetRValue(p) > 10 && GetGValue(p) <= 0 && GetBValue(p) <= 0) { mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Sleep(50); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } Sleep(10); } ReleaseDC(0, hdcScreen); return 0; }hdc screen muss ich in der schleife aktualisieren, da ich ja nach einem pixel auf dem aktuellen bild suche !
leider hat sich an den aussetzern nicht viel geändert

-
Ob das GetDC in die Schleife sollte oder nicht kann ich nicht sagen.
Auf jeden Fall gehört das ReleaseDC mit in die Schleife wenn GetDC in der Schleife steht, oder eben beide ausserhalb der Schleife.Und "SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);" würde ich eben aufrufen... (ok, kannste auch übern task manager machen zum testen).
-
pixartist schrieb:
... da ich ja nach einem pixel auf dem aktuellen bild suche !
http://www.c-plusplus.net/forum/viewtopic-var-t-is-178107.html
