반응형 C#66 null-coalescing assignment 연산자(??=) 가 C# 8.0에서 추가된 문법이라, C# 7.3 컴파일러로는 사용할 수 없다는 뜻입니다. 좋은 포인트예요. 오류 메시지는 null-coalescing assignment 연산자(??=) 가 C# 8.0에서 추가된 문법이라, C# 7.3 컴파일러로는 사용할 수 없다는 뜻입니다.빠른 수정 (원인→해결)원인:assemblies ??= new[] { Assembly.GetExecutingAssembly() }; // C# 8.0 문법C# 7.3 호환 수정:if (assemblies == null) assemblies = new[] { Assembly.GetExecutingAssembly() };또한, 제가 드렸던 예시 중에 using var 도 C# 8.0 문법입니다. C# 7.3에서는 전통적인 using (...) { } 블록으로 바꿔주면 됩니다.드롭인 패치: C# 7.3 호환 버전 메서드들아래는.. 2025. 9. 11. VisionThread/EmguVision 라이브·검사 공통 파이프라인 리팩토링 (풀코드) VisionThread/EmguVision 라이브·검사 공통 파이프라인 리팩토링 (풀코드)아래 코드는 그랩 콜백에서 포인터를 즉시 안전 복제(Mat.Clone) 하고, 라이브/검사 경로를 하나의 공통 파이프라인으로 통합한 구현입니다.포인터 수명 안전: 콜백 내 즉시 Mat.Clone()UI 스레드 규칙 준수: 화면 갱신은 BeginInvoke로 UI 스레드에서지연 최소화: 라이브는 “최신 1장만 유지” + 게이트로 중복 렌더 억제재사용성: SharedPipeline(...) 한 곳에서 라이브/검사 공통 처리 분기1) 클래스명VisionThread (그랩 콜백을 보유)EmguVision (화면 컨트롤)2) 클래스 개요 (Overview)VisionThread는 카메라 프레임 수신 시 그랩 포인터를 즉시 M.. 2025. 9. 10. EmguImage 안에 IInputArray를 반환하는 getter 좋아요! EmguImage 안에 IInputArray를 반환하는 getter들을 아래처럼 추가하면 됩니다.전체 이미지 차용 참조(Dispose 금지)ROI 기반 소유 참조(Dispose 필요)(호환용) 예전 코드에서 쓰던 Image 프로퍼티도 함께 제공합니다.// EmguImage 클래스 내부에 추가하세요 (namespace/using 동일)/// /// (호환용) 현재 내부 Mat을 IInputArray로 노출합니다. /// - 차용 참조(borrowed)이며, 호출자가 Dispose 하면 안 됩니다./// - 내부 m_Mat의 수명에 종속됩니다./// public IInputArray Image{ get { EnsureNotDisposed(); return IsVo.. 2025. 9. 9. private static bool IsFiniteFloat(float v) => !(float.IsNaN(v) || float.IsInfinity(v)); 아래 한 줄짜리 헬퍼의 의도/동작/사용 맥락을 정리해 드릴게요.private static bool IsFiniteFloat(float v) => !(float.IsNaN(v) || float.IsInfinity(v));1) 함수 개요 (Overview)역할: 입력한 float v가 유한한 수(finite) 인지 검사합니다.유한값 = NaN(숫자 아님)도 아니고, ±Infinity(무한대)도 아닌 모든 실수 값.왜 필요한가?.NET Framework 4.x에는 float.IsFinite(...)가 없어 동일 기능을 대체하기 위한 유틸입니다.확대 배율, 좌표 스케일 등 연산 결과를 화면에 쓰기 전에 값의 안정성을 보장하기 위해 사용합니다.2) 시그니처와 접근성private: 현재 클래스 내부에서만 사용.st.. 2025. 9. 9. 소멸자(~EmguVision)로 GDI 리소스(Pen)를 해제하는 방식은 권장되지 않습니다. 좋은 포인트예요. 결론부터:소멸자(~EmguVision)로 GDI 리소스(Pen)를 해제하는 방식은 권장되지 않습니다.WinForms 컨트롤은 Dispose(bool disposing) 를 override 해서 관리되는 리소스는 disposing == true일 때 해제하는 표준 패턴을 따르는 게 정석이에요.소멸자(파이널라이저)는 성능에 불리하고, 호출 시점도 불확실하며, 관리 객체에 접근하면 위험합니다. → 소멸자 제거 권장.InitializeComponent() 는 디자이너가 자동 생성하는 컨트롤 초기화(자식 컨트롤 배치, 속성 바인딩, 리소스 연결, 이벤트 wiring 등) 코드가 들어가는 자리입니다. 현재 내용이 비어있어도 “디자이너 초기화 진입점”으로 남겨두는 게 맞습니다.아래에 권장 리팩토링을.. 2025. 9. 9. ScrollableControl을 상속받았다는 건, “이 컨트롤은 화면(뷰포트)보다 큰 가상의 캔버스를 갖고, 자동 스크롤바/스크롤 오프셋 관리까지 운영체제가 대신 해주는 컨테이너”라는 뜻입니다. ScrollableControl을 상속받았다는 건, “이 컨트롤은 화면(뷰포트)보다 큰 가상의 캔버스를 갖고, 자동 스크롤바/스크롤 오프셋 관리까지 운영체제가 대신 해주는 컨테이너”라는 뜻입니다.(= 스크롤바가 필요할 때 자동으로 생기고, 스크롤 위치에 맞춰 그리기 좌표가 바뀌는 베이스 클래스를 쓰는 것)무엇을 얻나? (핵심 기능)AutoScroll / AutoScrollMinSize / AutoScrollPositionAutoScroll = true로 켜면, AutoScrollMinSize에 “가상 캔버스 크기”를 설정해 스크롤바를 자동 표시.현재 스크롤 오프셋은 AutoScrollPosition으로 읽음(주의: 반환값은 음수).표준 스크롤 UX마우스 휠, 스크롤바 드래그, 키보드 스크롤 등 WinFo.. 2025. 9. 9. 1. C# 스레드 생성과 병렬 처리 이해 1. 스레드란 무엇인가?스레드는 프로그램 실행의 기본 단위입니다.프로세스(Process): 실행 중인 프로그램의 인스턴스입니다. 프로세스는 독립적인 메모리 공간과 자원을 갖고 실행됩니다.스레드(Thread): 프로세스 내부에서 실행되는 작은 작업 단위입니다. 한 프로세스는 여러 개의 스레드를 가질 수 있으며, 스레드는 프로세스의 메모리와 자원을 공유합니다.2. 스레드와 프로세스의 차이 구분프로세스스레드정의실행 중인 프로그램프로세스 내부에서 실행되는 작업 단위자원 사용각 프로세스는 독립적인 메모리와 자원을 갖습니다.프로세스의 자원을 공유합니다.오버헤드새로운 프로세스를 생성하면 많은 자원이 필요합니다.새로운 스레드는 프로세스보다 가볍고, 더 적은 자원을 사용합니다.병렬 처리여러 프로세스는 병렬로 실행되지만,.. 2025. 1. 24. 4. 태스크 병렬 라이브러리 1. 태스크 생성개념: 태스크는 비동기 작업을 실행하는 기본 단위입니다. Task.Run 또는 Task.Factory.StartNew를 사용하여 태스크를 생성할 수 있습니다.주요 메서드:Task.Run: 비동기 작업을 실행합니다.Task.Wait: 태스크 완료 대기.Task.Result: 태스크 결과 반환.2. 태스크로 기본적인 연산 수행개념: 배열의 각 요소를 병렬로 처리하거나 CPU 바운드 작업을 병렬화하여 효율성을 높입니다.주요 메서드:Task.Run과 Parallel.ForEach로 데이터를 병렬로 처리.태스크의 결과를 수집하거나 추가 연산 수행.3. 태스크를 함께 조합개념: 여러 태스크를 조합하여 의존성을 처리하거나 결과를 결합합니다.주요 메서드:Task.WhenAll: 모든 태스크 완료 후 처.. 2025. 1. 20. C# APM(Asynchronous Programming Model) 패턴 C# APM(Asynchronous Programming Model) 패턴APM(Asynchronous Programming Model)은 비동기 프로그래밍을 구현하는 오래된 패턴으로, .NET Framework 초기에 설계되었습니다. 이 패턴은 Begin/End 메서드 쌍을 사용하여 비동기 작업을 수행하고, 콜백 또는 IAsyncResult를 통해 결과를 처리합니다.APM의 주요 개념Begin/End 메서드 쌍:비동기 작업을 시작하는 BeginXXX 메서드와 작업을 완료하고 결과를 가져오는 EndXXX 메서드로 구성됩니다.예: FileStream.BeginRead()와 FileStream.EndRead().IAsyncResult 인터페이스:BeginXXX 메서드는 비동기 작업의 상태를 나타내는 IAsy.. 2025. 1. 20. C# 태스크(Task)와 비동기 프로그래밍: 생성, 연속 작업, 부모-자식 관계 이해 internal class Program { static int TaskMethod(string name, int second) { DateTime now = DateTime.Now; string formattedTime = now.ToString("HH:mm:s:fff"); Console.WriteLine($"[{formattedTime}] " + "Task {0} is running on a thread id {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, .. 2025. 1. 20. 이전 1 2 3 4 5 ··· 7 다음 반응형