fckorea's life, library, research. :: 'Programming/C# Sample Code' 카테고리의 글 목록
Thread와 UI Control에 대한 글을 계속 올리는듯...ㅜㅜ
다수의 UI에 접근하게될 시에 다수의 Delegate 함수가 만들어질수도 있으니, 한번이면 족한 것들은 아래와 같이 쓰자!ㅜㅜ

private void ThreadFunc()
{
    this.BeginInvoke(new MethodInvoker(delegate()
	{
		this.MyTextBox.Text = "fckorea!";
	}
    ));
}


Thread 함수 내에서 BeginInvoke(비동기 호출)로 할 수 있다.ㅎㅎㅎ
단, 비동기니 즉시 안바뀔지도...ㅎㅎㅎ


Thread에서 UI Control에 접근 시에 Delegate를 이용하여 접근해야되는데, 값 Setting은 해봤지만 Get은 안해봤다...ㅜㅜ 결국 해야될 일이 생기고, 찾다가 알게된 내용!

private delegate string GetTextBoxCallback(TextBox tbTxtBox);

private string GetTextBox(TextBox tbTxtBox)
{
    if (this.tbTxtBox.InvokeRequired)
    {
        GetTextBoxCallback GetTextBoxCB = new GetTextBoxCallback(GetTextBox);
        return (string) this.InvokeGetTextBoxCB, new object[] { tbTxtBox });
    }
    else
    {
        return tbTxtBox.Text;
    }
}


중요한건 Invoke 요청시 꼭 return (리턴타입)으로 해야됨!!!

C#에서 Thread 사용 시 CrossThreadCall에 대한 처리가 까다롭다...
물론 아래 같이 설정 하나로 무시할 수 있지만, 누수가 발생하는 점이 있다...

CheckForIllegalCrossThreadCalls = false;    // CrossThreadCall 관련 에러 무시


그리고 정당(?)한 방법으로 CrossThreadCall을 해결하려면, 대리자(delegate)를 이용하여야 한다. 예제를 찾아보면 변경하려는 각 컨트롤 마다 대리자와 접근 함수를 만들어 줘야해서 불만이었다...ㅜㅜ
그런데 우연히 들어간 블로그(http://redreans.tistory.com/64) 해당 내용에 대한 좋은 내용이 있지 않은가!!!
해당 내용을 이용하여, 같은 타입(TextBox, Label등)의 컨트롤을 하나의 대리자와 함수로 접근할 수 있다는 것을 알게 됐다!!!ㅜㅜ(감격)

private delegate void SetTextBoxCallback(TextBox tbTxtBox, string strMsg);

private void SetTextBox(TextBox tbTxtBox, string strMsg)
{
    if (this.tbTxtBox.InvokeRequired)
    {
        SetTextBoxCallback SetTextBoxCB = new SetTextBoxCallback(SetTextBox);
        this.Invoke(SetTextBoxCB, new object[] { tbTxtBox, strMsg });
    }
    else
    {
        tbTxtBox.Text = strMsg;
        tbTxtBox.Update();
    }
}


위의 소스를 좀 더 연구하면, 하나의 대리자와 함수로 원하는 컨트롤을 다 접근할 수 있지 않을까?ㅜㅜ


C#에서 Process에서 사용하고 있는 Module List를 얻는 방법.

using System.Diagnostics;
using System.ComponentModel; 

namespace CSharpTestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] ProcList = Process.GetProcesses();

            foreach (Process Proc in ProcList)
            {
                Console.WriteLine(Proc.ProcessName + " In Modules");
                try
                {
                    foreach (ProcessModule ProcModule in Proc.Modules)
                    {
                        Console.WriteLine(ProcModule.FileName);
                    }
                }
                catch(Win32Exception Win32Ex)
                {
                    Console.WriteLine(Win32Ex.Message);
                }
            }
            Console.ReadLine();
        }
    }
}


ProcessModule 주요 속성

BaseAddress : Module이 Load된 메모리 주소.
EntryPointAddress : Module Entry Point Address.
FileName : File Full Path.
FileVersionInfo : Module의 버전 정보.
ModuleName : Module's.

Process 주요 메서드

-

Ref : http://msdn.microsoft.com/ko-kr/library/system.diagnostics.processmodule.aspx



C#에서 Process List를 얻는 방법.

using System.Diagnostics;

namespace CSharpTestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] ProcList = Process.GetProcesses();

            foreach (Process Proc in ProcList)
            {
                Console.WriteLine(Proc.ProcessName);
            }
            Console.ReadLine();
        }
    }
}


Process 주요 속성

Id : PID
MainModule : Process Full Path.
MainWindowTitle : Main Window 창의 Caption.
Modules : Process의 모듈들.
Threads : Process의 스레드들.

Process 주요 메서드

GetProcessById(Int32) : Local의 해당 Id(PID)를 가진 Process를 반환.
GetProcesses() : Local의 모든 Process를 반환.
GetProcessByName(String) : Local의 해당 이름을 가진 Process를 반환.

Ref : http://msdn.microsoft.com/ko-kr/library/system.diagnostics.process.aspx


티스토리 툴바