using System;
using System.Threading;

namespace ThreadNTask
{
    class Program
    {
        static void Main(string[] args)
        {
            Counter counter = new Counter();

            Thread increaseThread = new Thread(new ThreadStart(counter.Increase));
            Thread decreaseThread = new Thread(new ThreadStart(counter.Decrease));

            increaseThread.Start();
            decreaseThread.Start();

            increaseThread.Join();
            decreaseThread.Join();

            Console.WriteLine(counter.Count);

        }
    }

    class Counter
    { 
        const int LOOP_COUNT = 1000;

        readonly object thisLock;

        private int count;
        
        public int Count
        { 
            get{ return count; }
        }

        public Counter()
        { 
            thisLock = new object();
            count = 0;
        }

        public void Increase()
        { 
            int loopCount = LOOP_COUNT;
            while(loopCount-- > 0)
            {
                lock(thisLock)
                { 
                    count++;
                }
                Thread.Sleep(1);
            }
        }

        public void Decrease()
        { 
            int loopCount = LOOP_COUNT;

            while(loopCount-- > 0)
            {
                lock(thisLock)
                { 
                    count--;
                }
                Thread.Sleep(1);
            }
        }
    }
}
using System;
using System.Threading;

namespace ThreadNTask
{
    class Program
    {
        static void Main(string[] args)
        {
            SlideTask slideTask = new SlideTask(100);

            Thread thread = new Thread(new ThreadStart(slideTask.KeepAlive));
            thread.IsBackground = true;

            Console.WriteLine("스레드 시작");
            thread.Start();

            Thread.Sleep(100);

            Console.WriteLine("스레드 종료");
            thread.Interrupt();

            Console.WriteLine("스레드가 멈출때까지 대기");
            thread.Join();

            Console.WriteLine("종료");
        }
    }

    class SlideTask
    { 
        private int count;

        public SlideTask(int count)
        { 
            this.count = count;
        }

        public void KeepAlive()
        {
            try
            {
                Console.WriteLine("실행중인 스레드가 중단되지 않습니다.");
                Thread.SpinWait(100000000);

                while(count > 0)
                {
                    Console.WriteLine($"{count --} left");

                    Console.WriteLine("WaitJoinSleep State 로 바뀌는 중");
                    Thread.Sleep(10);
                }
                Console.WriteLine("Count: 0");
            }
            catch(ThreadAbortException threadAbortException)
            {
                Console.WriteLine(threadAbortException);
            }
            finally
            {
                Console.WriteLine("리소스 지우기");
            }
        }

            

    }

    
}

'C# > 책 예제' 카테고리의 다른 글

C# Thread Monitor 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread lock 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread 인터럽트로 종료하기.  (0) 2019.06.08
C# Thread 상태 변화  (0) 2019.06.08
C# Thread 임의 종료  (0) 2019.06.08
C# / Thread 시작  (0) 2019.06.08
using System;
using System.Threading;

namespace ThreadNTask
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintThreadState(ThreadState.Running);

            PrintThreadState(ThreadState.StopRequested);

            PrintThreadState(ThreadState.SuspendRequested);

            PrintThreadState(ThreadState.Background);

            PrintThreadState(ThreadState.Unstarted);

            PrintThreadState(ThreadState.Stopped);

            PrintThreadState(ThreadState.WaitSleepJoin);

            PrintThreadState(ThreadState.Suspended);

            PrintThreadState(ThreadState.AbortRequested);

            PrintThreadState(ThreadState.Aborted);

            PrintThreadState(ThreadState.Aborted | ThreadState.Stopped);
        }

        private static void PrintThreadState(ThreadState threadState)
        {
            Console.WriteLine("{0, -16} : {1}", threadState, (int)threadState);
        }
    }
}

'C# > 책 예제' 카테고리의 다른 글

C# Thread Monitor 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread lock 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread 인터럽트로 종료하기.  (0) 2019.06.08
C# Thread 상태 변화  (0) 2019.06.08
C# Thread 임의 종료  (0) 2019.06.08
C# / Thread 시작  (0) 2019.06.08
using System;
using System.Threading;

namespace ThreadNTask
{
    class Program
    {
        static void Main(string[] args)
        {
            SlideTask slideTask = new SlideTask(100);
            Thread thread = new Thread(new ThreadStart(slideTask.KeepAlive));
            thread.IsBackground = true;

            Console.WriteLine("스레드를 시작합니다.");
            thread.Start();

            Thread.Sleep(500);

            Console.WriteLine("스레드를 종료합니다.");
            thread.Abort();

            Console.WriteLine("스레드가 멈출때까지 대기합니다.");
            thread.Join();

            Console.WriteLine("종료");
        }
    }

    class SlideTask
    { 
        private int count;

        public SlideTask(int count)
        { 
            this.count = count;
        }

        public void KeepAlive()
        {
            try
            {
                while(this.count > 0)
                {
                    Console.WriteLine($"{count--} left");
                    Thread.Sleep(10);
                }
                Console.WriteLine("Count: 0");
            }
            catch(ThreadAbortException threadAbortException)
            {
                Console.WriteLine(threadAbortException);
                Thread.ResetAbort();
            }
            finally
            {
                Console.WriteLine("Clearing resouce");
            }
        }
    }
}

'C# > 책 예제' 카테고리의 다른 글

C# Thread Monitor 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread lock 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread 인터럽트로 종료하기.  (0) 2019.06.08
C# Thread 상태 변화  (0) 2019.06.08
C# Thread 임의 종료  (0) 2019.06.08
C# / Thread 시작  (0) 2019.06.08

스레드 예제 입니다.

using System;
using System.Threading;

namespace ThreadNTask
{
    class Program
    {
        static void Main(string[] args)
        {
            // 스레드의 인스턴스를 생성합니다.
            Thread thread = new Thread(new ThreadStart(ThreadTest));

            Console.WriteLine("스레드 시작");

            // 스레드를 시작합니다.
            thread.Start();

            // ThreadTest 메소드가 실행되는 동시에 메인 스레드의 반복문도 같이 실행됩니다.
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine($"메인: {i}");
                Thread.Sleep(500);
            }

            Console.WriteLine("스레드 멈출때까지 대기합니다.");

            // 스레드의 종료를 대기합니다.
            thread.Join();

            Console.WriteLine("종료");
        }

        // 스레드를 실행할 메소드 입니다.
        private static void ThreadTest()
        {
            for(int i = 0; i < 10; i++)
            {
                Console.WriteLine($"ThreadTest: {i}");

                // Sleep() 메소드는 다른 스레드도 CPU를 사용할 수 있도록 CPU 점유를 내려놓습니다.ㅅ
                Thread.Sleep(500);
            }
        }
    }
}

'C# > 책 예제' 카테고리의 다른 글

C# Thread Monitor 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread lock 키워드를 이용한 동기화  (0) 2019.06.08
C# Thread 인터럽트로 종료하기.  (0) 2019.06.08
C# Thread 상태 변화  (0) 2019.06.08
C# Thread 임의 종료  (0) 2019.06.08
C# / Thread 시작  (0) 2019.06.08

XtraDialog로 로그인 화면 만들기 입니다.

 

LoginUserControl.cs 파일 입니다.

using System.Windows.Forms;

using DevExpress.XtraEditors;
using DevExpress.XtraLayout;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 로그인 유저 컨트롤 클래스 입니다.
    /// </summary>
    public partial class LoginUserControl : XtraUserControl
    {
        // Constructor (Public)

        #region LoginUserControl() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public LoginUserControl()
        {
            InitializeComponent();

            LayoutControl layoutControl = new LayoutControl();

            layoutControl.Dock = DockStyle.Fill;

            TextEdit textLogin      = new TextEdit();
            TextEdit textPassword   = new TextEdit();
            CheckEdit checkEditKeep = new CheckEdit(){ Text = "Keep me Signed in" };

            SeparatorControl separatorControl = new SeparatorControl();

            layoutControl.AddItem(string.Empty, textLogin    ).TextVisible = false;
            layoutControl.AddItem(string.Empty, textPassword ).TextVisible = false;
            layoutControl.AddItem(string.Empty, checkEditKeep);

            this.Controls.Add(layoutControl);

            this.Height = 100;
            this.Dock   = DockStyle.Top;

        }

        #endregion
    }
}

 

MainForm.cs 파일 입니다.

using System;
using System.Windows.Forms;

using DevExpress.XtraEditors;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
       
        // Constructor (Public)

        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            this.simpleButton1.Click += simpleButton1_Click;

        }

        #endregion

        // Event Method (Private)
        #region simpleButton1_Click(sender, e) - 버튼 클릭시 동작합니다.

        /// <summary>
        /// 버튼 클릭시 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            LoginUserControl myControl = new LoginUserControl();

            if(XtraDialog.Show(myControl, "Sign in", MessageBoxButtons.OKCancel) == DialogResult.OK)
            { 
            
            }
        }

        #endregion

    }
}

입력상자에 커스텀 에디터 출력하기 입니다.

 

예제

using System;
using System.Windows.Forms;

using DevExpress.XtraEditors;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
       
        // Constructor (Public)

        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            XtraInputBoxArgs xtraInputBoxArgs = new XtraInputBoxArgs();

            xtraInputBoxArgs.Caption = "Shipping options";
            xtraInputBoxArgs.Prompt  = "Delivery Date";
            xtraInputBoxArgs.DefaultButtonIndex = 0;
            xtraInputBoxArgs.Showing += xtraInputBoxArgs_Showing;

            DateEdit editor = new DateEdit();

            editor.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.TouchUI;
            editor.Properties.Mask.EditMask = "yyyy-MMMM-dd";
            xtraInputBoxArgs.Editor = editor;

            xtraInputBoxArgs.DefaultResponse = DateTime.Now.Date.AddDays(3);

            var result = XtraInputBox.Show(xtraInputBoxArgs).ToString();

        }

        #endregion

        #region xtraInputBoxArgs_Showing(sender, e) - 입력 박스가 출력될 때 발생합니다.

        /// <summary>
        /// 입력 박스가 출력될 때 발생합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void xtraInputBoxArgs_Showing(object sender, XtraMessageShowingArgs e)
        {
            e.Form.Icon = this.Icon;
        }

        #endregion
    }
}

메시지 박스안의 버튼에 커스텀 폰트 적용하기 입니다.

 

 

using System.Windows.Forms;

using DevExpress.XtraEditors;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
       
        // Constructor (Public)

        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            XtraMessageBoxArgs xtraMessageBoxArgs = new XtraMessageBoxArgs();

            xtraMessageBoxArgs.Caption                                   = "메시지 박스 버튼 커스텀 폰트 설정하기";
            xtraMessageBoxArgs.Text                                      = "메시지 박스 버튼 커스텀 폰트 설정하기";
            xtraMessageBoxArgs.Buttons                                   = new DialogResult[] {DialogResult.OK};

            #region 이벤트를 설정합니다.

            xtraMessageBoxArgs.Showing += xtraMessageBoxArgs_Showing;
            #endregion

            XtraMessageBox.Show(xtraMessageBoxArgs).ToString();
        }


        #endregion

        // Event Method (Private)

        #region xtraMessageBoxArgs_Showing(sender, e) - 폼이 닫히기 전에 발생합니다.

        /// <summary>
        /// 메시지 박스가 출력될 때 발생합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void xtraMessageBoxArgs_Showing(object sender, XtraMessageShowingArgs e)
        {
            e.Form.Appearance.FontStyleDelta = System.Drawing.FontStyle.Bold;

            MessageButtonCollection buttons = e.Buttons as MessageButtonCollection;

            SimpleButton button = buttons[DialogResult.OK] as SimpleButton;

            if(button != null)
            { 
                button.Appearance.FontSizeDelta = 15;
                button.Height                  += 10;
            }
        }

        #endregion
    }
}

메시지 박스안의 버튼에 커스텀 이미지 추가할 수 있습니다.

 

예제

using System.Windows.Forms;

using DevExpress.XtraEditors;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {        
        // Constructor (Public)

        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            XtraMessageBoxArgs xtraMessageBoxArgs = new XtraMessageBoxArgs();

            xtraMessageBoxArgs.Caption                                   = "메시지 박스 버튼에 이미지 추가하기";
            xtraMessageBoxArgs.Text                                      = "메시지 박스 버튼에 이미지 추가하기";
            xtraMessageBoxArgs.Buttons                                   = new DialogResult[] {DialogResult.OK, DialogResult.Cancel, DialogResult.Retry};

            #region 이벤트를 설정합니다.

            xtraMessageBoxArgs.Showing += xtraMessageBoxArgs_Showing;
            #endregion

            XtraMessageBox.Show(xtraMessageBoxArgs).ToString();
        }

		#endregion

        // Event Method (Private)

        #region xtraMessageBoxArgs_Showing(sender, e) - 폼이 닫히기 전에 발생합니다.

        /// <summary>
        /// 메시지 박스가 출력될 때 발생합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void xtraMessageBoxArgs_Showing(object sender, XtraMessageShowingArgs e)
        {
            foreach(var control in e.Form.Controls)
            {
                SimpleButton button  = control as SimpleButton;

                if(button != null)
                { 
                    button.ImageOptions.SvgImageSize = new System.Drawing.Size(16, 16);

                    switch(button.DialogResult.ToString())
                    { 
                        case ("OK"):
                            button.ImageOptions.SvgImage = this.svgImageCollection1[0];
                            break;
                        case ("Cancel"):
                            button.ImageOptions.SvgImage = this.svgImageCollection1[1];
                            break;
                        case ("Retry"):
                            button.ImageOptions.SvgImage = this.svgImageCollection1[2];
                            break;
                    }
                }
            }
        }

        #endregion
    }
}

DevExpress / Winform 자동 종료 메시지 박스 만들기 입니다.

몇초뒤에 닫힐지 설정하고, 설정된 시간이 점점 줄어드는 것을 확인할 수 있습니다.

 

 

using System.Windows.Forms;

using DevExpress.XtraEditors;

namespace WindowsFormsApp1
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
        // Constructor (Public)

        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            XtraMessageBoxArgs xtraMessageBoxArgs = new XtraMessageBoxArgs();

            xtraMessageBoxArgs.AutoCloseOptions.Delay                    = 5000;
            xtraMessageBoxArgs.Caption                                   = "자동 종료 메시지";
            xtraMessageBoxArgs.Text                                      = "이 메시지는 5초 뒤에 닫힙니다.";
            xtraMessageBoxArgs.Buttons                                   = new DialogResult[] {DialogResult.OK, DialogResult.Cancel};
            xtraMessageBoxArgs.DefaultButtonIndex                        = 0;
            xtraMessageBoxArgs.AutoCloseOptions.ShowTimerOnDefaultButton = true;

            XtraMessageBox.Show(xtraMessageBoxArgs).ToString();

            #region 이벤트를 설정합니다.

            this.FormClosing += mainForm_FormClosing;

            #endregion
        }

        #endregion
    }
}

 

+ Recent posts