인터페이스가 고정되어있는 C# .NET 멀티 스레드 응용 프로그램이 있습니다. 이는 특이한 점은 화면 보호기를 시작할 수있을만큼 시스템을 유휴 상태로 두지 않으면 인터페이스가 멈추지 않는다는 것입니다. 시스템을 다시 사용하려면 암호를 다시 입력해야합니다. 인터페이스가 다시 표시되면 (암호를 성공적으로 입력 한 후) 인터페이스가 잠 깁니다. 스크린 세이버를 시작하지 않으면 인터페이스가 잠기지 않습니다.멀티 스레딩 C# 응용 프로그램에서 인터페이스가 멈 춥니 다.
동일한 DLL에 액세스 할 수있는 두 개의 실행 파일이 있으며 DLL에 액세스하는 데 어떤 응용 프로그램을 사용하든이 문제가 발생하고 있음을 지적해야합니다. 이것은 두 응용 프로그램이 DLL과 관련성이있는 것과는 별개로 (C++/MFC)와 (C# /. NET) 완전히 다른 것으로서 DLL에 문제가 있음을 암시하는 것으로 보입니다.
두 exes는 DLL과 상호 작용하는 방식이 비슷한 단계를 수행합니다. DLL을 호출하여 직렬 포트 통신을 설정하고 DLL에서 상태 창을 열고 DLL에서 통신 포트를 모니터링하는 스레드를 시작한 다음 dll에서 스택을 모니터링하는 주 응용 프로그램에서 스레드를 시작합니다.
데이터가 통신 포트에서 DLL의 스레드에 의해 얻어지면 파싱되고 결과가 스택에 배치 된 다음 대리인을 통해 상태 창에 게시됩니다. exe의 스레드가 스택의 데이터를 볼 때 주 창에서 대리자를 사용하여 데이터를 출력합니다.
DLL 내 스레드에 코드를 추가하여 30 초마다 Application.DoEvents()를 호출하면 인터페이스가 약 30 초 동결되어 정상적인 동작을 다시 시작한다는 것을 알게되었습니다. 무언가가 주 스레드를 차단하고 DoEvents()가 강제로 잠금을 해제하는 것으로 보이지만이 잠금을 유발할 수있는 정보가 없습니다.
이 문제는 내 개발 컴퓨터와 테스트 컴퓨터에서 발생합니다.
나는 DLL 내부의 상태 창에 대한 데이터 출력을 완전히 제거하려고 시도했지만 아무런 차이가 없었습니다.
나는 수년간 멀티 스레드 프로그래밍을 해오 고 있으며 이와 같은 것을 본 적이 없다. 그래서 어떤 조언을 크게 주시면 감사하겠습니다.
감사합니다.
디버거에서 고정 된 UI를 일시 중지하고 호출 스택을 봅니다. – SLaks
비 UI 스레드에서만 DLL 메서드를 호출하고 UI 스레드로 마샬링 해 봤니? – RobS
이것은 전체적으로 도움이되지는 않지만 화면 보호기가 작동 할 때 켜지는 절전 기능이 있습니까? (포트가 잠자기 상태가 될 수 있다고 생각합니다.) – vlad259