仮面's profile宇宙仮面の C# 研究室.Live SpacePhotosBlogListsMore ![]() | Help |
|
July 16 プロセスモニタどこかで見たことのあるようなものをWPFで作ってみた。 簡単に作れるだろうと思っていたのだけど、いくつか、ハマり中。 1.プロセスの情報を取るいいI/Fが見つからない。System.Diagnostics.Process.GetProcesses() だと、プロセッサタイムが取得できないので、しかたなしにWMIでプロセスの情報を取っているのだけれど、結構重くって、CPUパワーが食われまくり。パフォーマンスカウンターを全プロセス分持つのも芸がないし、Win32 SDKを叩くか?? .NETで、いい方法ない? 2.画面のリサイズもフォントサイズとPolygon の関係をちゃんと考えないといけないので、意外と難しい。 3.おまけに6角形にレイアウトするのも面倒。誰か、HexaFlowコントロール作ってくれないかな w でも、こんな感じで http://uchukamen.com/pmon/publish.htm 意外と見ていて面白い。 PS. LINQ は偉大だ。もう LINQ 無しでは生きていけない体になってしまった。 July 15 Generic Dictionary の foreachあまり使わないので忘れないようにメモ Dictionary<uint, Process> processDict = new Dictionary<uint, Process>(100); foreach (KeyValuePair<uint, Process> val in processDiff) July 13 WPF ユーザーコントロール<UserControl x:Class="WpfApplication6.Cell" <Label Name="label1" HorizontalContentAlignment="Center" Margin="6,15,6,0">Label</Label> </UserControl> 用途は・・・ Process 情報の取得に関するメモ2WMI を使用して Process 情報を取得する際に LINQ を使用しようとすると ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process"); var query = from proc in queryCollection1 select proc; エラー 1 ソース型 'System.Management.ManagementObjectCollection' のクエリ パターンの実装が見つかりませんでした。'Select' が見つかりません。範囲変数 'proc' の型を明示的に指定してください。 C:\Users\uchukamen\Documents\Visual Studio 2008\Projects\WpfApplication6\WpfApplication6\Window1.xaml.cs 140 38 WpfApplication6 というエラーになる。 回避方法は、範囲変数 proc の型を明示的に指定するために、queryCollection1.Cast<ManagementObject>() としてあげるとうまくいった。うむむむむ・・・ ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process"); var query = from proc in queryCollection1.Cast<ManagementObject>() select proc; ------ もうちょっと見やすく?すると、IEnumerable<ManagementObject> にキャストしてくれるということ。 ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process"); var procs = from proc in procQuery select proc; foreach (var process in procs) Process 情報の取得に関するメモVisual Studio 2008 , Vista で、GetProcesses() でプロセス情報を取得する際に、TotalProcessorTime などプロセッサタイムを取得しようとすると、Win32Exception により取得できない。なぜ?? var query = from proc in System.Diagnostics.Process.GetProcesses() foreach (var process in query) ----------------- WMI を使用すれば、取得可能。 ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process"); foreach (ManagementObject mo in queryCollection1) Visual Studio 2010 Parallel - Processシーケンシャルだと var query = from proc in System.Diagnostics.Process.GetProcesses() select proc; これがパラレルだと、 var query = from proc in System.Diagnostics.Process.GetProcesses() select proc; 処理的には、パラレルでもシーケンシャルでも関係ないので、パラレルで実行しているほうが処理する人の感覚(意図)に近いのかもしれない。 Visual Studio 2010 ParallelVisual Studio 2010 beta を入れてみた。
using System.Threading; … Stopwatch sw = new Stopwatch(); … 実行結果 x : ManagedThreadId ------------- 0 : 8 こんなことができてしまうなんて・・・ |
|
|