2011-12-23 1 views
0

vb6에서는 값이 변경되면 즉시 텍스트 상자 업데이트를 볼 수 있지만 .net에있는 것으로 나타났습니다. 현재있는 메서드가 종료 될 때까지 업데이트되지 않습니다 . 내가 가진 예비 질문은 메서드가 완료되기 전에 텍스트 상자를 업데이트하는 방법이 있는지 여부입니다.이상한 서식 동작입니다. text 속성을 설정 한 후 텍스트 상자에 나타나는 텍스트 만

문제는 Text 속성이 설정된 두 개의 텍스트 상자가 있고 메서드가 완료되면 그 중 하나만 일관되게 화면에 업데이트된다는 것입니다. 다른 하나는 보통 그렇지 않지만 때로는 그렇습니다. 매우 산발적입니다. 나는 문자 그대로 미친 알약을 먹지 않고 있다는 것을 증명하기 위해 누군가를 불러 냈고, 물론 그녀가 왔을 때 (비록 내가 코드 변경을하지는 않았지만) 일을 시작했다. 그런 다음 QA 녀석이 돌아 왔을 때 다시 작업을 중단했습니다 (다시 코드 변경을하지 않았습니다).

내가 해왔 던 모든 것은 중단 점을 설정하고이 텍스트 상자가 업데이트되지 않도록 유지하려는 코드를 단계별로 실행하는 것입니다. 절차가 끝나기 전에 종료 직전에 Text 속성을 확인할 수 있으며 올바른 값을 갖지만 메서드가 끝나면 사라집니다.

나는 곧 코드 스 니펫을 얻으려고 하겠지만, 그 동안에는 다른 사람들이이 문제와 디버깅 방법에 대한 좋은 아이디어를 갖고 있는지 알고 싶다. 나는 조금 좌절하고있다! 특정 시점에서 활성화되고 실행될 때 비활성화되는 타이머가이 타이머에 있습니다.이 타이머에 중단 점을 설정하면 중단 점이 절대 도달하지 않는 범인 b/c가 아닌지 확인됩니다. 그러나 내가 놓칠지도 모르는 다른 비동기 프로세스가있을 수 있는지 궁금합니다 ... 나는 그렇게 생각하지 않습니다. 그러나 당신이 저에게 무엇을 말해 줄 수 있다면, 나는 그것을 생각하지 않았을 수도 있습니다.

편집 : 코드 스 니펫을 게시 하겠지만 게시하려는 스 니펫은 문제를 재현하지 못하고 게시하기에 충분히 작은 코드 섹션으로 문제를 격리하지 않았습니다. 그래도 조금 더 많은 정보를 추가 할 것입니다 :

이 텍스트 상자를 업데이트하는 방법이 완료되면 컨트롤은 양식으로 돌아갑니다. 진행중인 다른 프로세스가 없습니다. 나는 어쩌면 일부 코드가 어딘가에서 텍스트 상자를 비우고 있다고 생각해 왔지만 코드를 통해 철저하게 살펴본 결과 이것이 확실한 것은 아니라고 확신했다.

때때로 디버깅 할 때 제대로 작동하고 드물게 정상적으로 실행될 때도 제대로 작동합니다. DoEvents()를 추가하여 작동하는지 확인하고 처음 수행했지만 ... 계속 작동하지 않았습니다. 좌절감에서 나는 텍스트 상자와 DoEvents()를 설정하기 위해 반복적 인 호출을 추가했다. 마지막으로 Sleep()에 대한 호출을 300 밀리 초 동안 추가했으며 지금은 더 좋아진 것 같습니다.

동일한 절차에서 설정되고 거의 모든 사항을 업데이트하는 데 문제가없는 폼에 또 다른 거의 동일한 텍스트 상자가 있음을 기억하십시오. 두 컨트롤 사이의 차이점을 찾았으며 크기, 위치 및 이름을 제외하고는 차이점을 찾을 수 없습니다.

+0

갱신 코드 – Nighil

+0

@Nighil에 질문 난 당신이 내가 말한 부분을 간과 추측 위해 Threading을 사용할 수 있습니다 yourtextbox.Invalidate();

을 다시 그려야 당신이 더 발생합니다 Invalidate(); 이것을 사용할 생각 " 나는 곧 코드 스 니펫을 얻으려고 노력할 것입니다. ":) –

+1

VB6과 VB.NET 사이에는 고유 한 것이 없습니다. 'DoEvents'는 해킹 해결책이지만 좋은 것은 아닙니다. 교훈은 UI (메인) 스레드에서 장기 실행 계산이나 다른 작업을 절대로하지 않는 것입니다. UI가 정지합니다. 'BackgroundWorker' 컴포넌트는이 어플리케이션에 맞게 만들어졌습니다. MSDN 페이지는 훌륭한 샘플을 가지고 있으며 여기에서 동일한 질문을하는 많은 사람들을 찾을 수 있습니다. –

답변

1

텍스트 상자 텍스트 값을 설정 한 후 Application.DoEvents()을 추가 할 수 있습니다. 그것은 일반적으로 DoEvents를 사용하기에 눈살을 찌푸지 만 중급에서 문제를 해결할 수도 있습니다.

+0

vb6에서 DoEvents를 사용하여 발생하는 꽤 심각한 버그가 수정되었지만 실제로 무슨 일을하는지 알기 때문에 문제가 없습니다. 그리고 즉시 업데이트하고 싶은 유일한 이유는 디버깅 목적을위한 것이므로 트릭을해야한다고 생각합니다. 나를 생각 나게 해줘서 고마워! –

+0

DoEvents에 관해 더 많은 이야기가 있습니다. DoEvents를 검색하면 여러 가지 답변을 읽을 수 있습니다 (내가 좋아하는 것을 찾을 수없는 한스 패전트의 생각 - 훌륭함). – TheBlastOne

+0

@ TheBlastOne 그래, 나는 그것에 대해 무리를 읽고 익숙한 소리 그래서 어쩌면 내가 생각하는 똑같은 하나를 읽어보십시오. 나는 항상 그런 것들에 대한 모든 찬반/단점을 알아야만하는 사람입니다 ... 사람들이 일에 대해 담요 결정을 내릴 때 싫어합니다. 나는 그들을 이해하고 적절할 때 사용하는 것을 좋아한다. –

0

은 내가 컨트롤이 목적

+0

시도해 보았지만 즉시 업데이트되지는 않습니다. 메서드가 완료 될 때까지 여전히 기다리고 내가 호출하지 않은 경우와 동일하게 동작합니다. –

+0

그리고 스레딩이 여기서 도움이된다고 생각하지 않습니다. 스레딩을 사용하면 Invoke()를 호출해야 메인 스레드에서 업데이트가 발생하지만 이미 메인 스레드에있는 메서드를 실행하는 동안 업데이트를 원했습니다. 내가 잘못 수 있지만 지금 DoEvents() 디버깅 목적으로 충분합니다. –

관련 문제