C#関連

.NET Tips & Tutorial Web

.NET Framework 3.0

テーマ別ページ

一般

特定の処理にタイムアウトを実装するには

Application.DoEvents()の注意点

プロセスで使っているメモリの大きさなど

簡単な処理時間計測用クラス

class ProfTime
{
  bool bInProf = false;
  long m_start;
  long m_end;

  public void Start() 
  {
    Debug.Assert(bInProf == false);
    
    m_start = DateTime.Now.Ticks;
    bInProf = true;
  }
  public void End() 
  {
    Debug.Assert(bInProf);
    m_end = DateTime.Now.Ticks;
    bInProf = false;
  }
  public long GetErapsed() 
  {
    Debug.Assert(bInProf == false);
    //Debug.Assert(m_end != m_start);
    return (m_end - m_start)/10000;
  }
  public double GetErapsedD() 
  {
    Debug.Assert(bInProf == false);
    //Debug.Assert(m_end != m_start);
    double d = (m_end - m_start);
    return d/10000;
  }
  public void End(string msg) 
  {
    End();
    Log.OutLog("PRF:" + msg + "所要時間:" + GetErapsed() + "ms");
  }
}

アイドルイベントの使い方

IEnumeratorの実装例

リソースに埋めたテキストデータの取得

/// <summary>
/// リソースからテキストを取ってくる
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
String getResourceTxt(String name) 
{
	try 
	{
		System.Reflection.Assembly myAssembly =	System.Reflection.Assembly.GetExecutingAssembly();
		System.IO.StreamReader sr = 
			new System.IO.StreamReader(
			myAssembly.GetManifestResourceStream(name),
			System.Text.Encoding.GetEncoding("shift-jis"));

		//内容を読み込む
		String s = "";
		s = sr.ReadToEnd();

		/*
		// 改行を取りたければこうする。
		String  ws;
		do
		{
			ws = sr.ReadLine();
			s += ws + " ";
		}while( ws != null);
		*/

		//後始末
		sr.Close();

		return s;
	}
	catch(Exception ex) 
	{
		Debug.WriteLine(ex.Message);
		Debug.Assert(false);
		return "";
	}
}

Updaterサンプル

二重起動チェック

public static bool ChkDblProcess()
{
  Process p = Process.GetCurrentProcess();
  Process[] procs = Process.GetProcessesByName(p.ProcessName);

  foreach (Process wp in procs)
  {
    if (wp.Id != p.Id)
    {
      Log.Log_Write(LogType.ERROR, "同じプロセスが既に起動しています");
      return false;
    }
  }
  return true; //OK
}

二重起動チェックして起動してたら前出し

二重起動チェックでパフォーマンスカウンタが使えないという例外が出る現象

二重起動チェックで以下のようにしている場合

If (UBound(Diagnostics.Process.GetProcessesByName _
  (Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0) = True Then
    Exit Sub
End If 

以下のようなメッセージを伴う例外が発生することがある。

プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。

これは以下のレジストリキーが1になっていると起こるらしい。

HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\PerfProc\Performance\Disable Performance Counters

パフォーマンスカウンタが無効になり、上記の部分でInvalidOperationExceptionが発生するとのこと

.NETとCOM

他プロセス起動の例

using System.Diagnostics;
...
Process myProcess = new Process();
myProcess.StartInfo.FileName = "notepad.exe";
myProcess.StartInfo.Arguments = "";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
myProcess.Start();
myProcess.WaitForExit();

スレッド

コマンドライン引数を使いたい場合

ArrayListのソート


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS