본문 바로가기
반응형

컴퓨터/C#90

C# TCP Server (TcpClient 사용) TcpClient를 이용한 TCP Server 프로그램은 다음과 같다. int n; byte[] buf = new byte[1024]; TcpListener listener = new TcpListener(IPAddress.Any, 500); listener.Start(); while (true) { // 연결 대기 TcpClient tc = listener.AcceptTcpClient(); // 연결 NetworkStream stream = tc.GetStream(); // 수신 데이터 그대로 전송 while ((n = stream.Read(buf, 0, buf.Length)) > 0) { stream.Write(buf, 0, n); } // 닫기 stream.Close(); tc.Close(); } .. 2022. 10. 4.
C# TCP Client (TcpClient 사용) TcpClient를 이용한 TCP Client 프로그램은 다음과 같다. // 1.열기 TcpClient tc = new TcpClient("192.168.0.1", 500); NetworkStream stream = tc.GetStream(); // 2.전송 byte[] buf = new byte[10]; buf에 전송할 데이터 씀 stream.Write(buf, 0, buf.Length); // 3.시간지연 Thread.Sleep(100); // 4.수신 int n = stream.Read(buf, 0, buf.Length); // 5.닫기 stream.Close(); tc.Close(); TcpClient 메소드는 일정시간 동안 접속을 시도하고 접속을 실패하면 에러가 발생한다. 접속 실패했을 때는 t.. 2022. 10. 4.
DataGridView 컨텍스트 메뉴 DataGridView에서 마우스 우클릭했을 때 컨텍스트 메뉴를 사용하는 방법은 다음과 같다. private void dataGridView1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { int currentMouseOverRow = dataGridView1.HitTest(e.X,e.Y).RowIndex; ContextMenu m = new ContextMenu(); m.MenuItems.Add(new MenuItem("Menu1", Menu1_Event); m.Show(dataGridView1, new Point(e.X, e.Y)); } } private void Menu1_Event(object .. 2022. 6. 25.
DataGridView 줄 추가하기 DataGridView에서 줄을 추가하는 방법은 다음과 같다. DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone(); row.HeaderCell.Value = "R1"; row.Cells[0].Value = "A"; row.Cells[1].Value = "B"; row.Cells[2].Value = "C"; dataGridView1.Rows.Add(row); dataGridView1.Rows.Add(row)를 실행하면 새줄이 계속 추가된다. 2022. 6. 24.
DataGridView 셀 컬러 변경 DataGridView에서 셀의 배경색과 글자색은 다음과 같이 변경한다. dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.White; dataGridView1.Rows[0].Cells[0].Style.ForeColor = Color.Black; 셀의 배경색과 글자색을 한번 변경시킬때 시간지연이 생각보다 크다. 셀의 색 변경을 그때 그때 각자 하나씩 하지 말고 색 변경이 필요한 셀들을 for 문에서 한번에 변경하면 실행시간을 줄일 수 있다. 2022. 6. 24.
C# 마이크 입력 실시간 처리 NAuduio 라이브러리를 사용하여 마이크 입력을 시작하는 코드는 다음과 같다. using NAudio.Wave; var waveIn = new NAudio.Wave.WaveInEvent { DeviceNumber = 0, WaveFormat = new NAudio.Wave.WaveFormat(rate: 44100, bits: 16, channels: 1), BufferMilliseconds = 100 }; waveIn.DataAvailable += OnDataAvailable; waveIn.StartRecording(); 다음 함수는 100ms마다 실행된다. args.BytesRecorded는 8820(=44100*2*0.1)이다. private void OnDataAvailable(object sen.. 2022. 6. 20.
C# NAudio 라이브러리 설치 C#에서 NAudio 라이브러리를 설치하는 방법은 다음과 같다. 프로젝트 메뉴에서 NuGet 패키지 관리를 선택한다. 찾아보기에서 naudio를 입력하고 NAudio를 선택하여 설치한다. ☞ NAudio 홈페이지 2022. 6. 20.
C# comboBox 모든 아이템 복사 comboBox의 모든 아이템을 다른 comboBox로 복사하는 방법은 다음과 같다. comboBox1의 모든 아이템을 comboBox2로 복사한다. comboBox2.Items.AddRange(comboBox1.Items.Cast().ToArray()); 2022. 6. 8.
C# 도구상자에 SerialPort 컨트롤이 없을 때 C# 도구상자에는 아래와 같이 SerialPort가 있다. 만약 SerialPort가 없다면 새 프로젝트 만들기를 할때 아래와 같이 "Windows Forms 앱(.NET Framework)"를 선택했는지 확인한다. 아래의 "Windows Forms 앱"을 선택하면 SerialPort가 안 뜬다. 2022. 6. 1.
C# 스트링 - 정수 변환 정수 → 스트링 정수를 스트링으로 변환은 다음과 같다. string s = Convert.ToString(value, 10) 여기서, 10은 10진수를 의미하고 2,8,10,16이 될수 있다. 스트링 → 정수 스트링을 정수로 변환은 다음과 같다. short value = Convert.ToInt16(s, 10) 여기서, 10은 10진수를 의미하고 2,8,10,16이 될수 있다. 2022. 5. 27.
C# 배열 - 정수 변환 배열 → 정수 배열을 정수로 변환은 BitConverter 클래스를 사용한다. Int32 i = BitConverter.Int32(buf, 0) 여기서, 0은 배열 buf에서 Int32로 변환할 인덱스를 나타낸다. 정수 → 배열 반대로 정수를 배열로 변환은 다음과 같다. byte[] buf = BitConverter.GetBytes(i) 2022. 5. 27.
C# 다른 프로그램 창 보이기 C#에서 다른 프로그램 창을 맨 위로 보내는 방법은 다음과 같다. [DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd); Process[] processes = Process.GetProcessesByName("PROCESS NAME"); SetForegroundWindow(processes[0].MainWindowHandle); 윈도우가 최소화되어 있다면 아래의 코드를 함께 사용해야 프로그램 창이 표시된다. [DllImport("user32.dll")] internal static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam); .. 2022. 5. 26.
C#에서 sscanf와 비슷한 기능 C#에서 sscanf와 완전히 동일한 함수는 없다. 하지만, 다음과 같이 sscanf와 비슷하게 사용할 수 있다. string s = "1 2 3"; var p = s.Split(' '); int a = Convert.ToInt32(p[0]); int b = Convert.ToInt32(p[1]); int c = Convert.ToInt32(p[2]); ☞ var 변수형 2022. 5. 23.
C#과 C++ 공유 메모리 사용 공유 메모리는 메모리 매핑 파일(Memory-Mapped File)을 사용하여 데이터를 교환하는 것이다. 메모리 매핑 파일은 하드디스크가 아니라 램에 파일을 만들어 데이터를 고속으로 송수신할 수 있다. C++에서 메모리 매핑 파일을 만들고 만들어진 메모리 매핑 파일을 C#에서 읽는 방법은 다음과 같다. C++ C++에서 메모리 매핑 파일은 다음과 같이 사용한다. 다음과 같이 파일을 만든다. 파일 이름은 DataName이다. byte *p; HANDLE handle; handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Pair), L"DataName"); p = (byte*) MapViewOfFile(handle.. 2022. 5. 16.
C# 배열 메모리 할당/해제 C#에서 배열은 다음과 같이 선언하고 사용한다. int [] data = new int[10]; 배열이 로컬로 선언되었다면 함수를 빠져나가면 가비지 컬렉터(Garbage Collector)가 메모리를 자동으로 해제한다. C++에서는 new로 배열을 선언하면 delete을 사용하여 해제해야 하지만 C#에서는 그럴 필요가 없다. C#에서 강제로 메모리 해제하는 방법은 CG.Collect 함수를 사용하거나 unsafe를 사용하는 방법이 있다. 2022. 5. 4.
C# 주석 색깔 변경 C#에서 주석 색깔은 도구-옵션 메뉴을 선택하면 나오는 다음과 같은 창에서 수정한다. 2022. 5. 4.
C# unsafe 컴파일 옵션 unsafe 키워드를 사용하여 컴파일하면 다음과 같은 에러가 뜬다. error CS0227: 안전하지 않은 코드는 /unsafe를 사용하여 컴파일하는 경우에만 나타날 수 있습니다. 이 때는 프로젝트-속성 메뉴에서 안전하지 않은 코드 허용을 체크하면 된다. 2022. 5. 4.
[C#] Marshal 클래스 의미 Marshal 클래스는 Unmanage Memory 처리 관련 메소드들이 모여있는 클래스이다. 일반적인 Manage 코드는 CLR에서 관리하지만 Unmanage 코드는 CLR에서 관리하지 않는다. CLR (Common Language Runtime)는 .NET이 실행되는 가상머신이다. Marshal은 데이터를 저장이나 전송에 적합하도록 변환하는 것을 의미한다. 바이트 스트림으로 변환하는 것을 의미하는 Serialize와 비슷하다. 2022. 5. 3.
C# var 키워드 사용법 C#에서 var으로 선언된 변수는 컴파일러가 자동으로 데이터 타입을 지정한다. 아래 2개는 완전히 동일하다. var로 선언된 i는 초기화값 10을 보고 i를 int 형으로 사용한다. var i = 10; int i = 10; 아래 2개도 동일하다. var s = "123"; string s = "123"; var는 배열을 선언할때 데이터 형을 중복해서 입력하지 않아도 되는 편리함이 있다. var a = new int[10]; 2022. 5. 2.
[C#] unsafe 키워드와 포인터 C#에서는 기본적으로 포인터를 사용하지 않는다. 하지만, unsafe 키워드를 사용하면 포인터, 함수 포인터, 메모리 할당, Fixed 버퍼 등을 사용할수 있다. 2022. 5. 2.
[C#] typedef 사용하기 C#에서는 typedef을 지원하지 않는다. 대신 using을 사용하면 typedef 기능을 구현할 수 있다. using s08 = SByte; using u08 = Byte; using s16 = Int16; using u16 = UInt16; using s32 = Int32; using u32 = UInt32; 2022. 5. 2.
C# 구조체 사용하기 C#에서 구조체는 다음과 같이 사용한다. struct TEST { public byte a; } TEST test; test.a = 1; C# 구조체에서 C와 비슷한 배열을 사용하기 위해서는 다음과 같이 unsafe와 fixed을 사용해야 한다. unsafe struct TEST { public fixed byte a[8]; } 2022. 5. 1.
C# 소스 코드 파일로 나누기 C#에서 소스 코드를 여러 파일로 나누기 위해서는 다음과 같이 partial을 사용한다. namespace TEST { public partial class Form1 : Form { partial로 파일을 나누면 디자인에서 컨트롤을 더블클릭했을 때 각 컨트롤에 해당하는 메소드가 아닌 향상 Form1.cs로 이동하는 불편함이 있다. 2022. 5. 1.
C# 컬러 이름 C#의 컬러 이름과 RGB 값은 여기서 확인할수 있다. 색깔 표현을 나타내는 한국어가 많다고 하는데 영어도 만만치 않은 것 같다. 2022. 1. 15.
C# 숫자 표시 포맷 부동 소수점 변수 부동 소수점 아래 숫자 갯수는 다음과 같이 설정한다. f.ToString("0.0") f.ToString("0.0000") f.ToString("0.") 숫자 앞에 + 또는 - 부호를 붙이는 방법은 다음과 같다. f.ToString("+0.0;-0.0;0") 다음과 같이 사용할 수도 있다. String.Format("{0,5:F3}", f) f=1234.5678일때 f.ToString("g2") : 1.2e+03 f.ToString("g3") : 1.23e+03 f.ToString("g5") : 1234.6 정수형 변수 정수형 변수의 표시 크기를 지정하는 방법은 다음과 같다. String.Format("{0,5}", i) 위 코드는 " 123"과 같이 5자리로 표시된다. 2021. 12. 6.
C# 화면에 줄 표시하기 C#에서 Label을 사용하여 다음 그림과 같이 윈도우 화면에 줄을 표시할 수 있다. Label 컨트롤을 추가한 후 속성을 다음과 같이 변경한다. - Text를 지운다. - BorderStyle을 Fixed3D로 한다. - AutoSize를 False로 한다. - Size에서 높이를 2로 한다. 2021. 8. 10.
C# 문자열 - 숫자 변환 Convert.ToInt32()은 10진수 문자열을 숫자로 변경한다. string str = "1234"; int number = Convert.ToInt32(str); 16진수 문자열을 숫자로 변경하는 방법은 다음과 같다. string str = "FF00"; int number = Convert.ToInt32(str, 16); 숫자를 10진수 문자열로 변경하는 방법은 다음과 같다. string str = Convert.ToString(1234, 10); 2021. 7. 12.
C# Thread.Sleep 사용할 때 주의할 점 Thread.Sleep의 단위는 ms이지만 실제 시간 정밀도는 ms 단위가 아니다. 윈도우나 CPU에 따라 다르지만 대략 15~30ms 정도의 정밀도이다. 즉, Thread.Sleep(5)라고 해도 5ms 지연이 되지 않고 지연시간이 계속해서 변하면서 20ms 지연이 되기도 하고 1ms가 되기도 한다. Threas.Sleep은 새로운 쓰레드를 만들어 실행되기 때문에 메모리의 자원 낭비가 심하다. 정밀한 시간 지연을 위해서는 Stopwatch를 사용한다. Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); while (stopWatch.ElapsedMilliseconds < 40) {} stopWatch.Stop(); TimeSpan ts = stopWa.. 2021. 7. 12.
C# 데이터 형식 크기 C#의 데이터 형식과 크기는 다음과 같다. char가 1바이트가 아니라 2바이트이다. 2020. 11. 29.
C# Setting 설정화면 Settings.settings을 더블클릭 한다. 2020. 7. 30.
반응형