2016년 7월 27일 수요일

c# winform - acess controller in sub thread BeginInvoke((Action)(() => ControllerAcess ));


btnScan => Main Thread

메인스레드가 아닌곳에서 접근할려면 이렇게 하면 된다.

btnScan.BeginInvoke((Action)(() => btnScan.Enabled = true));


예를 들어

Thread tr;
private void button2_Click(object sender, EventArgs e)
{
tr = new Thread(method);
tr.Start();
}

private void method()
{
button1.Enabled = false;

button1.BeginInvoke((Action)(() => button1.Enabled = true));

Action act = new Action(invokemethod);
button1.BeginInvoke(act);

button1.BeginInvoke((Action)invokemethod);
}

private void invokemethod()
{
button1.Enabled = false;
}


이 서브 스레드에서 윈폼의 컨트롤러에 접근시 위와 같이 사용

c# winform - acess controller in sub thread


btnScan => Main Thread

메인스레드가 아닌곳에서 접근할려면 이렇게 하면 된다.

btnScan.BeginInvoke((Action)(() => btnScan.Enabled = true));


예를 들어

Thread subthrad = new Thread();

subthread.Start();


이 서브 스레드에서 윈폼의 컨트롤러에 접근시 위와 같이 사용

2016년 7월 17일 일요일

c# timer 사용설명

타이머 생성자 2개를 보자.

1. Timer(TimerCallback)

-새로 만든 Timer 개체를 상태 개체로 사용하고 무한 기간 및 무한 만료 예정 시간을 지정하여 Timer 클래스의 새 인스턴스를 초기화합니다.

2. Timer(TimerCallback, Object, Int32, Int32)

-부호 있는 32비트 정수로 시간 간격을 지정하여 Timer 클래스의 새 인스턴스를 초기화합니다.



------------------ 타이머 생성법 -------------

1. Input 파라미터를 object로 갖는 메소드 생성. (타이머에의해 실행될 메소드)
2. 타이머 생성 이떄 메소드가 Input 파라미터를 사용하는 경우는 2번의 생성자 사용.

Timer(Input파마리터가 object인 메소드, 메소드에 들어가는 Input 파마리터, 시작전 딜레이, 인터벌)




------------------------------------------------






void timermethod(object state)
{
Console.WriteLine(state.ToString()); <- 여기서 100만 출력함. Timer의 두번째 Input 파라미터가 100 이므로..
string temp2 = stage.GetPosition();
}


private void button1_Click(object sender, EventArgs e)
{
System.Threading.Timer timear = new System.Threading.Timer(new TimerCallback(timermethod), 100, 0,100);
temp1 = stage.GetPosition();
for (int i = 0; i < 4; i++)
{
stage.MoveAbsPosXX(40000);
stage.GetPosition();
stage.MoveAbsPosXX(1000);
stage.GetPosition();
}
}






2016년 7월 14일 목요일

C# winform (윈폼)에서 크로스 스레드 관리. Invoke 사용법


1. 크로스 스레드가 나는걸 생각한다. (ex. 윈폼의 컨트롤들. 얘네는 윈폼 생성시 어떤 스레드가 다 처리한다. 이 스레드를 스레드1 이라고 한다.)

2. 크로스 스레드가 나는 애들. 즉 윈폼의 컨트롤에 접근해서 이용 할려고 할때, 이 일은 스레드1 에게 다 시켜야 한다.

3. 그 외의 것은 스레드 2,3,.. 이 처리해도 된다.


4. 밑의 코드를 보자.

a.버튼 클릭 -> 스레드tr이 Thread_Test1을 실행한다.
b.Thread_Test1을 실행시켜 나가는데 도중에 프로그래스바컨트롤에 접근을 해야되서, 이부분을 스레드1이 처리하게 명령한다. (invoke)
c. progressBar1.Invoke(pro1,new object[] { i}); 이부분이 스레드1이 pro1을 처리하라고 하는부분.
d. pro1은 델리게이트로 progvarCall pro1 = new progvarCall(Thread_Test2);에서 Thread_Test2 가 pro1이다.
e. invoke 는 입력파라미터가 델리게이트 이므로 이렇게 쓴것이다.
f. 그러면 Thread_Test1에서 인보크 부분만 스레드1이 처리하고 나머지는 tr스레드가 처리한다.

즉, tr스레드는 다른거 하고있다가, tr스레드가 호출(인보크) 할때만 Thread_Test2를 실행하고, 끝나면 다시 다른거 하러간다.


public partial class Form1 : Form
{

Thread tr;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 1000000; //프로그래스의 최대값을 설정
tr = new Thread(Thread_Test1);
tr.Start();
}

delegate void progvarCall(int value);



public void Thread_Test1()
{
progvarCall pro1 = new progvarCall(Thread_Test2);

try
{
for (int i = 0; i < 1000000; i++) // for문을 이용해 프로그래스바의 값을 변경해 줍니다
{
//progressBar1.Invoke(new progvarCall(Thread_Test2),new object[] { i});
progressBar1.Invoke(pro1,new object[] { i}); // 크로스 쓰레드 발생부분만 따로 뺴준다.
//progressBar1.Invoke(pro1); < Invoke 형식 자체가 Invoke(Delegate method, params object[] args) 이다.
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
// 두번째 스레드
public void Thread_Test2(int var)
{
progressBar1.Value = var;
}


}

2016년 7월 13일 수요일

C# 델리게이트 (delegate)


1. 델리게이트는 모양이다.
2. 델리게이트에서 정한 모양을 따르는 메소드를 등록할 수 있다.

ex>

1. 델리게이트 정의

delegate void GoodMan(int value);
-> GoodMan 이라는 델리게이트는 입력 파라미터를 int value 를 같는 모양이다.

2. 델리게이트의 인스턴스 생성 (GoodMan이라는 델리게이트, 즉 클래스 같은걸 1 에서 만든거다.)

GoodMan yoamn = new GoodMan(Method);

-> 이제는 yoman = Method 가 됬다. Method 를 호출할때 Method로 해도, yoman 으로 해도 된다.

3. 다른 메소드 등록

그다음에 yoman을 method2 로 바꾸고 싶을때

yoman = new GoodMan(method2);
yoman = method2

이 둘중 하나를 쓰면 이제 yoman 은 method2 가 된다.

c# 쓰레드 윈폼 (Thread winform)


먼저 쓰레드를 생성하고, Thread_Test1 을 시작한다.

그러면 크로스 스레드 예외가 난다.

윈폼에서는 컨트롤들에 접근할 수 있는 스레드는, 처음에 컨트롤들을 만든 스레드 하나뿐이다.

따라서,처음에 컨트롤을 만든 쓰레드가 있는데, 다른 쓰레드를 만들고 이쓰레드가 프로그래스바 에 접근할려고 해서 이 예외가 발생한 것이다.






--------------------------------------------------------------------------------------------------
Thread tr
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
tr = new Thread(Thread_Test1);
tr.Start();


}

public void Thread_Test1()
{
try
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 1000000; //프로그래스의 최대값을 설정
for (int i = 0; i < 1000000; i++) // for문을 이용해 프로그래스바의 값을 변경해 줍니다
{
progressBar1.Value = i;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

2016년 7월 3일 일요일

Keithley SMU2600 Series Control Program (제어 프로그램)


Keithley SMU2600 Series Control Program 입니다.

기본 측정과 공장 스크립트 구현해 놨습니다. 공장 스크립트는 Linear Sweep 만 구현해 놨습니다.

이번주 내로 트리거까지 작업해서 다시 올릴 계획입니다.



https://app.box.com/s/2pbyl3xn4hbbqbdg3bzbythhqxcc0rv9