본문 바로가기

Programing (프로그래밍)

WPF & C# - Interlocked ( 멀티쓰레딩에서 변수 변경 시 필수 / lock 대체 / 멀티쓰레드 / MultiThread / Threading ) WPF & C# - Interlocked ( 멀티쓰레딩에서 변수 변경 시 필수 / lock 대체 / 멀티쓰레드 / MultiThread / Threading ) 동시에 여러 쓰레드에서 외부 변수를 POP 하거나 Peek 할 때 문제가 발생할 수 있다. ( POP, Peek 뭔 말인지 잘 모르겠다. 어쨌든 문제가 되는부분은 변수를 읽을때는 아니고 변경할 때를 말하는 듯 하다. ) 한 쓰레드에서 외부 변수를 변경하고 있을 때, 다른 쓰레드에서 그 변수를 읽는다면 전혀 다른 값이 발생 할 수 있다는 뜻이다. 이를 해결하기 위한것이 lock 였다. 그러나 lock 속도를 많이 잡아먹고 잘못 사용할 경우 교착상태에 빠지는등의 이슈가 발생되는 문제가 발생한다. 이를 방지하고자 나온것이 Interlocked 이다. .. 더보기
WPF & C# - TextBoxWaterMark ( 워터마크 / 배경글자 / 텍스트박스 ) WPF & C# - TextBoxWaterMark ( 워터마크 / 배경글자 / 배경글씨 / 텍스트박스 / BackgroundText / 백그라운드텍스트 ) Text 삭제 private void tbx_TextChanged(object sender, TextChangedEventArgs e) { if (tbx.Text == "") tbk.Visibility = Visibility.Visible; else tbk.Visibility = Visibility.Hidden; } private void tbx_GotFocus(object sender, RoutedEventArgs e) { tbk.Visibility = Visibility.Hidden; } private void tbx_LostFocus(object.. 더보기
WPF & C# - 비동기 이벤트 - BackgroundWorker ( 백그라운드워커 / ChangedEvent / Completed / Event ) WPF & C# - 비동기 이벤트 - BackgroundWorker ( 백그라운드워커 / ChangedEvent / Completed / Event ) using System.Windows; using System.Threading; using System.ComponentModel; BackgroundWorker bw; private void btn_Click(object sender, RoutedEventArgs e) { bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += bw_ProgressChanged; bw.RunWorkerCompleted += bw_RunWorkerCo.. 더보기
WPF & C# - 멀티쓰레딩 ( 멀티쓰레드 / MultiThread / Threading ) WPF & C# - 멀티쓰레딩 ( 멀티쓰레드 / MultiThread / Threading / 스레드 ) private void btn_Click(object sender, RoutedEventArgs e) { lbl.Content = ""; Thread thread1 = new Thread(new ThreadStart(Thread1)); Thread thread2 = new Thread(new ThreadStart(Thread2)); thread1.Start(); thread2.Start(); } void Thread1() { for (int i = 0; i < 10; i++) { Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { l.. 더보기
WPF & C# - Error 다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다 ( 에러 / 쓰레드 / Thread / Dispatcher.Invoke()) WPF & C# - Error 다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다 ( 에러 / 쓰레드 / Thread / Dispatcher.Invoke()) ' 다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다 ' 위 에러의 경우 UI를 담당하는 스레드가 아닌 다른 스레드가 UI 를 건드릴 때 발생함. ( Cross-thread 라고 함 ) Dispatcher.Invoke() 사용하여 해결하면 된다고 함. using System.Windows.Threading; Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { //your code })); [출처] [WPF.. 더보기
WPF & C# - 열행 맞추어 Grid 생성하기 ( makeGrid / ColumnDefinitions / RowDefinitions ) WPF & C# - 열행 맞추어 Grid 생성하기 ( makeGrid / ColumnDefinitions / RowDefinitions ) MainWindow.xaml MainWindow.xaml.cs public MainWindow() { InitializeComponent(); Init(); } void Init() { // Grid + Label 추가하기 int numGrd = 0; // grid 갯수 for (int row = 0; row < 26; row++) { // 세로 행 생성 bgGrd.RowDefinitions.Add(new RowDefinition()); for (int col = 0; col < 10; col++) { // 가로 열 생성 if (row == 1) bgGrd.Colum.. 더보기
WPF & C# - 비동기 async / await ( UI와 연산 분리 / 작업 후 결과값 리턴 방식 ) WPF & C# - 비동기 개념익히기 ( async / await ) string str; private void Btn_Click(object sender, RoutedEventArgs e) { btn.Content = "잠시만 기다려 주세요"; AAA(); } private async void AAA() { btn.Content = await BBB(); } private Task BBB() { return Task.Factory.StartNew(() => CCC()); } private string CCC() { for (int i = 0; i 별도 업무요청 후 결과만 보고.. 더보기
WPF C# - 함수 - GetDropFiles 드래그앤드랍 파일 가져오기 (drag&drop) private void Grid_Drop(object sender, DragEventArgs e) { List lstFile = GetDropFilesPaths(e); lbl.Content = ""; foreach (string s in lstFile) { lbl.Content += s + "\n"; } } /// /// GetDropFilesPaths 드랍파일 가져오기 /// /// DropData /// DropFiles private List GetDropFilesPaths(DragEventArgs e, bool deduplication = false) { string[] eDataFiles = (string[])e.Data.GetData(DataFormats.FileDrop); List lstFi.. 더보기