안녕하세요 C# 어플리케이션을 새로 개발하면서 기존에
c++에서 쓰이던 기능을 c# winform에서 구현하고자 하는데 해당부분을 구현도중 궁금증이 생겼습니다
아래와 같은 기능이 System.Windows.Forms.Application.DoEvents(); 와 동일하게 동작하는지 궁금합니다!
전체적인 맥락은 사인패드에서 확인 취소등 어떤걸 선택하는지 반복문을 돌면서 기다리는 동안
메세지 처리를 구현하는것입니다.
같은 동작을 기대하기 힘들다면… PInvoke를 통해 PeekMessage , translate등을 가져와서 똑같이 구현하거나
사인패드 입력동안 this.enabled 를 이용해 사용자가 폼에 입력을 못하도록 막아서 구현해볼 생각입니다.
질문 정리하겠습니다.
c++소스와 c#소스가 같은 동작을 기대해도 될까요?
기대하기 어렵다면 PInvoke를 이용하거나 enabled로 폼을 막는방법도 괜찮을까요?
C++
MSG msg;
BOOL bLoop = TRUE;
while (bLoop)
{
// 사용자가 어떤 버튼 선택했는지 확인하는 API , nRtn값 리턴
if (nRtn == 1 || nRtn == 3) // 확인이나 취소일 경우
{
bLoop = false;
}
while(PeekMessage(&msg, NULL , 0, 0, PM_REMOVE)) //사인입력도중 입력된 메세지들 처리
{
if (msg.Message == WM_QUIT)
{
bLoop = fasle;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
~이후 사용자선택에 따라 처리
C#
bool bLoop = true;
while (bLoop)
{
// 사용자가 어떤 버튼 선택했는지 확인하는 API , nRtn값 리턴
if (nRtn == 1 || nRtn == 3) // 확인이나 취소일 경우
{
bLoop = false;
}
System.Windows.Forms.Application.DoEvents(); //사인입력도중 폼에 입력된 메세지들 처리
}
사인을 하는 와중에 폼(이전엔 웹) 을 클릭하거나 옮기는 등의 행위를 할 경우
응답없음으로 전환되고 한두번까진 괜찮은데 클릭등이 여러번 누적되면 사인이 완료되고 난 후에
그대로 응답없음으로 프로그램이 죽어버립니다. 그래서 다른 게시글도 살피던 도중
loop에서 윈도우메세지가 쌓였다가 한번에 처리될 경우 문제가 된다고 봐서
해당 부분을 넣은 것으로 이해하고 있습니다…
말씀하신 완료취소등의 결과는 버튼체크함수호출하면 int값으로 사용자선택에 따라 값을 반환해줘서
위 소스 이후 부분에서 처리하고있습니다
답변 감사합니다^^
윈폼에서 버튼을 누르면 연결된 패드에 입력화면이 뜨는데
위 처리과정없이 입력화면이 떴을 때 윈폼창을 클릭하거나 창을 옮기는 경우 응답없음이 되고 몇번 누적될 경우
사인을 완료한 이후에 프로그램이 먹통이 되었습니다.
해당 부분을 찾아보니 루프 안에서 윈도우메세지가 여러개 누적됬다가 한번에 처리될 경우에 문제가 되서
위와 같은 처리를 한것으로 이해했습니다.
DoEvents 사용 시 문제는 없는데 이걸로 대체해도 되는지 확신이 안서서 질문을 드렸습니다
다시한번 답변 감사합니다
사인패드 자체가 타사에서 제공한 dll을 PInvoke로 가져와서 API만 사용하고 있습니다…
예를들면 SignPad_BtnCheck() 이런식으로 호출하면 결과값 1은 확인 2는 취소 이런식입니다.
이미지또한 사인패드dll이 만들어주고 생성되 이미지의 경로만 반환해주고 있습니다.
말씀해주신 접근방법은 힘들 것 같습니다. 제가 C#공부도 이제 시작해서 잘 이해도 안되구용…
마찬가지로 별도의 스레드에서 SignPad_BtnCheck()를 폴링방식으로 (이벤트 방식을 지원해주면 이벤트 방식이 가장 좋습니다.) 처리하고 입력이 완료되거나 취소했을 때 작업을 종료하는 식이 좋습니다.
윈폼에서는 BackgroundWorker를 쓰시면 구현이 가능하실 것 같은데요. 어떠세요?