Diskuze: event pro začátek procesu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
http://www.codeproject.com/Articles/12138/Process-Information-and-Notifications-using-WMI
Díky, bohužel to neřeší můj problém, takže menší upřesnění: spustí se jakýkoliv, i předem nedefinovaný, proces (tzn. do předu neznám, který proces se spustí - vím pouze, že vzroste/se změní v určité chvíli počet procesů ve windows)
public class ProcessChecker
{
public event Action<string> OnProcessChange;
private Process[] processes;
private Timer timer;
public ProcessChecker(int interval)
{
processes = Process.GetProcesses();
timer = new Timer
{
Interval = interval
};
timer.Tick += (o, e) =>
{
var allNewProcesses = Process.GetProcesses();
var newProcesses = allNewProcesses.Select(s => s.ProcessName).Except(processes.Select(s => s.ProcessName)).ToList();
processes = allNewProcesses;
foreach (string p in newProcesses)
OnProcessChange(p);
};
timer.Start();
}
}
Užití:
ProcessChecker processChecker = new ProcessChecker(1000);
processChecker.OnProcessChange += (p) =>
{
Debug.WriteLine(p);
};
Netestoval jsem to nějak moc, ale fungovalo to. Kdyžtak můžeš kouknout po nečem systémovém.
Ještě jsem to troku improvnul:
public class ProcessChecker
{
private class ProcessComparer : IEqualityComparer<Process>
{
public bool Equals(Process x, Process y)
{
return x.ProcessName == y.ProcessName && x.Id == y.Id;
}
public int GetHashCode(Process obj)
{
return obj.ProcessName.GetHashCode() ^ obj.Id.GetHashCode();
}
}
public event Action<Process> OnProcessChange;
private Process[] processes;
private Timer timer;
public ProcessChecker(int interval)
{
processes = Process.GetProcesses();
timer = new Timer
{
Interval = interval
};
timer.Tick += (o, e) =>
{
var allNewProcesses = Process.GetProcesses();
var newProcesses = allNewProcesses.Except(processes, new ProcessComparer()).ToList();
processes = allNewProcesses;
foreach (var p in newProcesses)
OnProcessChange(p);
};
timer.Start();
}
}
Dostaneš přímo celý proces a už si s ním dělej co chceš.
ProcessChecker processChecker = new ProcessChecker(1000);
processChecker.OnProcessChange += (p) =>
{
Debug.WriteLine(p.ProcessName);
};
}
Snad to je konečně co jsi chtěl
Ahoj,
pokud bys měl čas a chuť, nemohl bys to ještě jednou "improvnout" a
zakomentovat to? Přiznám se, že jsem se dokonale ztratil.
Kdybych měl parafrázovat Kocoura z Červeného trpaslíka, tak jsem tomu rozuměl po to "Ještě jsem to trochu improvnul."
Tady to máš:
public class ProcessChecker
// třída pro kontrolu procesů
{
private class ProcessComparer : IEqualityComparer<Process>
// podtřída pro jejich porovnávání
{
public bool Equals(Process x, Process y)
// porovnávající metoda
{
return x.ProcessName == y.ProcessName && x.Id == y.Id;
// samotné porovnání (rovnají se jména i ID
}
public int GetHashCode(Process obj)
// získání zahashovaného řetězce
{
return obj.ProcessName.GetHashCode() ^ obj.Id.GetHashCode();
// name XOR id
}
}
public event Action<Process> OnProcessChange; // událoct změny
private Process[] processes; // pole procesů
private Timer timer; // použitý časovač
public ProcessChecker(int interval) // konstruktor
{
processes = Process.GetProcesses(); // získání procesů
timer = new Timer //vytvoření časovače s předaným intervalem
{
Interval = interval
};
timer.Tick += (o, e) => // reakce na událost Tick časovače
{
var allNewProcesses = Process.GetProcesses();
// nové procesy
var newProcesses = allNewProcesses.Except(processes, new ProcessComparer()).ToList();
// list procesů, které jsou navíc oproti původním
processes = allNewProcesses;
// z nových se stanou staré pro další kontroly
foreach (var p in newProcesses)
OnProcessChange(p);
// volání funkce zaregistrované pro událost pro každý nový proces
};
timer.Start(); // start timeru
}
}
ProcessChecker processChecker = new ProcessChecker(1000);
// instance s timeoutem časovače 1000
processChecker.OnProcessChange += (p) => // reakce na událost
{
Debug.WriteLine(p.ProcessName); // zpracování (to co chceš dělat)
};
}
snad to takhle stačí.
Díky moc, teď tomu líp rozumím. Je to opravdu mnohem srozumitelnější.
Díky, ale obávám se, že nikoliv - možnosti událostí ve W8.1 (kde jich
je naštěstí už víc, než jen ve W8) v suspended režimu jsou značně
omezené, a nejen timer, ale i další workaroundy, které fungují normálně
na desktopu, se naneštěstí ukazují neúčinné, případně nespolehlivé
nebo absolutně nevhodné (například vyžadující neustálé připojení k
internetu )
http://msdn.microsoft.com/…h977059.aspx
K čemu to ve Win 8.1 potřebuješ ? Rozhraní je právě udělané tak, aby aplikace bez vědomí uživatele nedělala něco co by neměla. Nezasahovala přímo do systému apod aniž by o tom uživatel nevěděl.
Pro vytvoření Windows Store app a momentálně (veřejně) blíže
nespecifikovaná usnadnění pro uživatele (netvrdím, že se jedná o něco
převratného, ale podobnou app sem ve storu neviděl - dost možná to stejně
bude úplný propadák)
Proč přesně potřebuješ právě zjišťovat procesy ? Win 8.1 Modern UI je stejně jako Windows Phone uzavřené prostředí. Na 1. stranu možná mínus ze strany vývoje z druhé strany obrovské plus pro uživatele -> aplikace nebudou dělat neplechy.
Jak jsem již psal, blíže to specifikovat momentálně nebudu. A chci je zjišťovat právě proto, že mám zařízení s W8.1 i Windows Phone - je dost možné, že by takovou app (skoro) nikdo jiný nevyužil, případně od části zamýšlené funkcionality upustím kvůli složitosti pro běžného uživatele (vč. té zahrnující zjišťování procesů). Každopádně čím více se touto otázkou zabývám, mě to také začlo zajímat čistě ze zvědavosti z pohledu programátora, zda je něco takového vůbec možné (což je - bohužel z pohledu běžného užití nepoužitelné/nevhodné).
Mě spíš jde o to že se snažíš třeba o něco a vlastně to i píšeš
co je pro uživatele zbytečné. A přijmi fakt že W8.1 i WP jsou systémy ve
výoji, jsou celkem uzavřené a poskytují především funkcionalitu pro
uživatele ne pro nějaké hrabání a testování
Zobrazeno 17 zpráv z 17.