블로그 이미지
평강왕자

카테고리

분류 전체보기 (35)
Programming Lv1 (32)
Programming LV2 (0)
취미 (3)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

Monitor 사용법

Programming Lv1/C# / 2013. 6. 14. 14:33

C#클래스에 Monitor라는 클래스가 존재한다.

Lock기능을 하는 클래스라고 저는 이해하고 있지만 짧은 소견으로 말하는거니 궁금하신분들은 아래링크를 참조;;

http://msdn.microsoft.com/ko-kr/library/hf5de04k(v=vs.95).aspx

http://msdn.microsoft.com/ko-kr/library/system.threading.monitor.aspx

사용법은 비교적 간단하다.

Enter 집어넣는다. Exit꺼낸다.

Wait로 묶어 놓는다. Pulse로 풀어준다.

저는 이런식으로 이해하고 있지만 좀더 명쾌하지 못한점은 아직 공부가 부족하니 조언부탁드립니다.

차후 더 공부하게 되면 업데이트 시키겠습니다.(게으르지만;)

매우 간단한 코드를 만들어 보았다;;

생성하자 마자 Thread를 생성하여 Thread안에서 다시 Timer Thread를 만들어서 5초뒤에 Pulse를 호출하여

Wait상태를 풀어주는 코드이다.

public MonitorTestClass()
{
    ThreadPool.QueueUserWorkItem(MessageClick);
}

public void MessageClick(object obj)
{
      lock (this)
     {
          ThreadPool.QueueUserWorkItem(MonitorLockClear);
          Monitor.Wait(this);
          MessageBox.Show("Message Aleart");
      }
}

void MonitorLockClear(object obj)
{
     int count = 0;
     while (true)
     {
          Thread.Sleep(1000);
          if (count == 5)
          {
               count = 0;
               lock (this)
              {
                   Monitor.Pulse(this);
               }
          }
          count++;
      }
}

주로 Monitor는 Msdn 샘플 코드에서도 Queue를 들고 있을정도로 Queue 관리에서 많이 사용하는 것 같다.

저도 Queue에서 사용하려고 Lock함수를 찾아보던 중에 찾게됐으니;;

무작정 Queue를 쓰면 메모리가 너무 많이 올라가서 컴퓨터가 멈춰버리는 현상이 발생해서

큐에 집어넣는 부분을 Wait걸어줄 필요성을 느껴서 찾게 되었다.

차후에 공부를 더한후에 업데이트 시키겠습니다.

'Programming Lv1 > C#' 카테고리의 다른 글

OpenFileDialog 파일 선택창  (0) 2013.04.10
C# partial class  (0) 2013.01.30
c# enum 사용하기  (0) 2013.01.30
C# 2차원 배열선언  (0) 2011.07.21
C#에서 컨트롤 이동시 스크롤 위치계산하여 상위부터 표시  (0) 2011.07.21
Posted by 평강왕자
, |

C#의 OpenFIleDialog 클래스는 파일선택 창을 지원한다.

기본 사용법은 아래와 같다.

OpenFileDialog oFileDlg = new OpenFileDialog();

            if (oFileDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //처리부분
            }

이렇게 사용하면 아마도 파일 선택을 *.* 로 될것이다.

이러한 경우 자기가 원하는 파일들만 표시해야 하는 경우가 있을경우 아래와 같이 사용하면 편리하다.

OpenFileDialog oFileDlg = new OpenFileDialog();

            oFileDlg.Filter = "All(*.*)|*.*|Text(*.txt)|*.txt";
            if (oFileDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //처리부분
            }

이런 방식으로 사용하면 콤보박스에 *.*, *.txt 두가지가 생긴다.

'Programming Lv1 > C#' 카테고리의 다른 글

Monitor 사용법  (0) 2013.06.14
C# partial class  (0) 2013.01.30
c# enum 사용하기  (0) 2013.01.30
C# 2차원 배열선언  (0) 2011.07.21
C#에서 컨트롤 이동시 스크롤 위치계산하여 상위부터 표시  (0) 2011.07.21
Posted by 평강왕자
, |

MFC를 할때에도 MainFrame HWND값이 필요한 경우가 종종 있었다.

WPF를 하면서도 MainWindow HWND값이 필요한 경우가 생겼다.

가져오는 방법은 아래와 같다.

MainWIndow mainWnd = Application.Current.MainWindow as MainWindow;

HWND을 가져와서 사용하면 된다.

Posted by 평강왕자
, |

C# partial class

Programming Lv1/C# / 2013. 1. 30. 11:26

c#을 하면서 처음으로 오!! 좋다!! 신기하다!! 괜찮다!! 라고 느낀것이 partial class다..

내가 이해한건 하나의 하드디스크를 파티션 나눠서 c:\, d:\ 만들어서 c:\에는 OS, d:\에는 데이터 이런식으로 사용하는 느낌?

하나의 클래스에 기능이 많이 들어가는 경우 코드가 길어지고 복잡해 지는데.. (물론, 따로 클래스 만들어서 관리 하는 방법도 있지만)

기능별로 나눠서 쓸수 있다..

DataManager라는 클래스를 만들어서 사용하는데 영상데이터, 이미지데이터, 음성데이터 이렇게 3가지가 있는 경우에 하나의 클래스에

전부 집어 넣기에는 관리하기 힘들고, 그렇다고 클래스를 3개로 나누자니 복잡해 지는것 같고 이럴 때가 종종 있었는데.

partial을 사용하면 하나의 클래스에 파일만 여러개가 되어서 관리 할 수 있다.

편리한건 영상데이터는 이제 사용하지 않을때 그 파일만 삭제하면 되니 일일히 찾아다닐 필요도 없다. ㅎㅎ

사용법은 아래와 같다.

파일명은 그냥 지으면 된다. DataManager.cs, DataManager.Movie.cs, DataManager.Image.cs, DataManager.Voice.cs

저는 이렇게 사용함 영어에 무지 약함;;

소스코드 안에 아래 내용을 넣어주면 된다.

namespace Data
{
    public partial class DataManager
    {
        //내용
    }
}

namespace, class명을 동일하게 맞춰줘야 하고 클래스 부분 앞에 partial 이라고 붙여 줘야 한다.

생성자는 DataManager.cs부분에만 존재 하면 된다. 전부다 넣을 필요 없다. 각자 사용 용도에 맞게 소스 내용을 집어 넣으면 된다.

별거 아닌 내용인데 글이 길었네요;;

 

'Programming Lv1 > C#' 카테고리의 다른 글

Monitor 사용법  (0) 2013.06.14
OpenFileDialog 파일 선택창  (0) 2013.04.10
c# enum 사용하기  (0) 2013.01.30
C# 2차원 배열선언  (0) 2011.07.21
C#에서 컨트롤 이동시 스크롤 위치계산하여 상위부터 표시  (0) 2011.07.21
Posted by 평강왕자
, |

Java

Programming Lv1/Java / 2013. 1. 30. 11:13

1년을 자바를 했는데..

글쓴게 하나도 없네.. Java하면서 한 내용들도 정리해야 하는데 이놈의 게으름이란..

Posted by 평강왕자
, |

c++ 처럼 #define이 c#에는 없다.

#define의 기능중에 자주 사용하던 기능이 문자열, 숫자를 정해놓고 변수로 불러 사용했었다.

나름 혼자 코드에 빨강색 들어가는것 싫어해서;; 중복되게 사용되면 찾아다니면서 바꿔주는 것도 귀찮고;;

c#을 하면서 #define이 사라져서 좌절 (OTL) 그래서 찾아보니 enum이라는 형식이 존재 한다.

약간 구조체? 라고 이해하면 될려나;;

사용법은 일단

public enum test {변수1, 변수2, 변수3, 변수4 };

위와 같이 사용하면 변수1에는 자동으로 0, 변수2에는 1, 변수3에는 2, 변수4에는 3이 라는 값이 대입된다.

물론 아래와 같이 하나씩 정의 하면 그 값이 대입된다.

public enum test {변수1 = -1, 변수2 = 2, 변수3 = 5, 변수4 = 7 };

숫자는 이렇게 사용되고 문제는 문자열 저의 경우엔 한글;;

public enum test {사과, 귤, 배추, 무 };

위와 같이 쓰면 한글이 들어간다. 처음엔 당황스러웠다. 무슨 한글이 변수가 되지;; 단 띄워쓰기는 허용하지 않는다.

실 사용시에 아래와 같이 사용한다.

string str = "사 과";

if(str.Replace(" ", "").Equals(test.사과))
{
    //처리 함수
}

'Programming Lv1 > C#' 카테고리의 다른 글

Monitor 사용법  (0) 2013.06.14
OpenFileDialog 파일 선택창  (0) 2013.04.10
C# partial class  (0) 2013.01.30
C# 2차원 배열선언  (0) 2011.07.21
C#에서 컨트롤 이동시 스크롤 위치계산하여 상위부터 표시  (0) 2011.07.21
Posted by 평강왕자
, |

WPF를 사용하다보면 UserControl에서 Windows에 함수를 호출해야 하는 경우가 있다.

코드상으로 객체를 생성하면 별 문제가 없다. 생성할때 아래와 같이 자신의 객체를 넘겨 주면 알 수 있다.

private MainWindow ;

public DataManager()
{
    this.InitializeComponent();
}

public DataManager(MainWindow parent)
{
    this.InitializeComponent();
    this.parent = parent;
}

위에와 같이 DataManager UserControl에 생성자를 하나 더 추가하고 MainWindow Window에서 생성할때

DataManager datamanager = new DataManager(this);

코드상으로 객체를 생성하지 않고 Xaml 코드를 사용하면 생성자에 객체를 넣어서 넘겨 줄 수가 없다.

이런 경우 난감해진다.

하지만 event를 사용하면 해당 이벤트를 호출하여 다른     객체에서 event를 감지하여 처리가 가능하다.

Xaml코드에서 해당 객체에 Name을 주고 코드에서 그 객체에 Event핸들러를 추가해 주면 된다.

1. UserControl에 event 변수를 추가 한다.

public event EventHandler EventDataManager;

2. Windows에서 객체에 Event처리 함수를 등록한다.

dataManager.EventDataManager += new EventHandler(dataManager_EventDataManager);

void dataManager_EventDataManager(object sender, EventArgs e)
{
    //처리할 내용
}

3. UserControl에서 호출할 시점에 아래와 같이 Event를 발생 시킨다.

EventDataManager(this, null);

이렇게 사용하면 UserControl에서 버튼 클릭시 이벤트를 발생시키면 실제 처리는 등록해 놓은 함수가 Windows에 있기 때문에

 Windows가 호출 된다. 그러면 Windows에서 객체를 사용하고 처리 하면 된다.

Posted by 평강왕자
, |

다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다.

Exception이 발생하면서 프로그램이 죽어버렸다.

C# WPF을 시작한지 얼마되지 않아서 검색 해 보니 WPF는 메인스레드가 UI 객체를 가지고 있어서 다른 스레드에서 접근하여

사용하려 하면 Exception을 발생시킨다고 하더군요;;

해결 방법은 Dispatcher.Invoke(DispatcherPriority, Delegate) 함수를 사용하면 해결 됩니다.

http://msdn.microsoft.com/ko-kr/library/ms591593.aspx <-- msdn링크

설명은 잘 나와있습니다. 만능 MSDN;;

실제로 적용하면 아래와 같은 코드를 다른 스레드에 집어넣어서 사용하면 Exception이 발생합니다.

controlSendBtn.Visibility = Visibility.Collapsed;

이것을 아래와 같이 바꿔줍니다.

Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{
    controlSendBtn.Visibility = Visibility.Collapsed;
 }));

그러면 메인스레드와 동기화 시켜서 Exception없이 잘 돌아갑니다.

 

Posted by 평강왕자
, |

telerik RadGridView를 사용하면 기본적으로 항목을 더블클릭하여 수정할 수 있다.

그 항목을 수정할시에 수정되었을때 이벤트를 주고 싶을 때 RowEditEnded Properties를 사용하면 이벤트를 줄 수 있다.

소스는 아래와 같다.

Xaml

<telerik:RadGridView x:Name="UserGridView" Margin="20,40,20,0" VerticalAlignment="Top" Height="278" ItemsSource="{Binding UserList}" RowIndicatorVisibility="Hidden" CanUserDeleteRows="False" CanUserInsertRows="False" RowEditEnded="UserGridView_RowEditEnded" ShowGroupPanel="False" AutoGenerateColumns="False">

cs

private void UserGridView_RowEditEnded(object sender, Telerik.Windows.Controls.GridViewRowEditEndedEventArgs e)
{
      데이터형식 변수 = (데이터형식)UserGridView.SelectedItem;
}

위 코드는 에디트시에 선택한 항목을 가져오는 소스이다.

사용하고자 하는 형태에 맞게 변경 하면 된다.

기본적으로 수정이 가능하지만 수정하면 안돼는 경우에는 Column의 ReadOnly Properties를 사용하면 된다.

<telerik:GridViewDataColumn UniqueName="ID" Header="사용자 ID" HeaderTextAlignment="Center" IsReadOnly="True" IsFilterable="False" MaxWidth="240" Width="120"/>

true일 경우 수정이 불가능하고 false인 경우 수정이 가능하다 기본값은 false이다.

 

Posted by 평강왕자
, |

XamOutlookbar에서 각 Group을 클릭했을때 이벤트를 잡아서 처리해야 하는 경우가 있다.

그경우 Xaml에서 아래와 같이 넣어 주면 된다.

<igOutlookBar:XamOutlookBar x:Name="outlookbar" HorizontalAlignment="Right" Margin="0,2,0,226" Width="384"

 SelectedGroupChanging="함수명" >

 

이렇게 하면 .cs파일의 함수가 호출된다.

oldSelected : 전에 선택한 그룹

newSelected : 현재 선택한 그룹

private void 함수명(object sender, Infragistics.Windows.OutlookBar.Events.SelectedGroupChangingEventArgs e)
{
    string oldSelected = e.CurrentSelectedOutlookBarGroup == null ? "null" : (string)e.CurrentSelectedOutlookBarGroup.Header;
    string newSelected = e.NewSelectedOutlookBarGroup == null ? "null" : (string)e.NewSelectedOutlookBarGroup.Header;
}

 

Posted by 평강왕자
, |

최근에 달린 댓글

글 보관함