2013-10-17 2 views
0

그래프 응용 프로그램을 작성하고 그래프를 표시합니다. 응용 프로그램이 시작되면 지정된 위치에서 자동으로 원시 데이터를 읽고이를 자동으로 그래프로 표시합니다. 그래프가 화면에 표시된 후에 파일에 자동 저장하는 기능을 추가했습니다.양식을 화면에 표시 한 후 N 초 동안 조치를 수행하는 코드를 프로그래밍하는 방법?

Bitmap memoryImage = new Bitmap(picCube.Size.Width, picCube.Size.Height); 
Graphics g = Graphics.FromImage(memoryImage); 
Point plotLoc = picBox.PointToScreen(Point.Empty); 
g.CopyFromScreen(plotLoc.X, plotLoc.Y, 0, 0, picBox.Size); 
memoryImage.Save(savePath, ImageFormat.Jpeg); 

대한 제한은 그래프가 이미 화면에 표시 한 후이 방법은 작동합니다 :

방법 내가 저장을하고 있어요는 비트 맵으로 화면의 픽셀을 잡아 비트 맵을 저장하는 것입니다. 저장을 수행 할 메뉴 항목이 있는데 메뉴에 도달하기 위해 응용 프로그램이 이미 화면에 표시되었으므로 문제없이 작동합니다. 이제 자동 저장 기능을 추가 했으므로 화면에 양식이 완전히 표시된 후에 만 ​​저장 작업을 트리거 할 수 있어야합니다.

현재 저장 작업을 트리거하는 N 초 후에 꺼지는 폼의 Load 이벤트에 타이머를 넣고 있습니다. 타이머가 GUI 스레드와 다른 스레드에 있기 때문에 어떤 이유로 타이머 스레드가 GUI 요소에 액세스 할 수 없다는 것을 의미하므로 아마 작동하지 않습니다.

배경 작업자와 같이 지나치게 복잡한 접근 방법을 사용하지 않고이 간단한 작업을 수행하는 더 좋은 방법이 있습니까?

+1

'await Task.Delay()' – SLaks

+2

더 좋은 방법은 스크린 샷을 찍는 대신 이미지 파일을 저장하도록 차트 개체를 가져 오는 것입니다! –

+0

어떤 타이머? UI 스레드에서 UI 타이머 개체 (도구에서 드래그 할 수 있음)가 UI 스레드에서 실행되고 작동해야 함 – Alan

답변

0

양식의 Load은 양식이로드 될 때 마지막으로 실행되는 것이 아닙니다.

아마 밖으로 윈폼 이벤트 로딩 순서를 System.Windows.Forms.Form.Shown

확인하십시오 : Winforms - order of Load and Activated events

당신이 로컬 컴퓨터의 타이밍에 따라 문제를 처리 할 필요가 없습니다 그런 식으로.

+0

좋은 링크를 주셔서 감사합니다. 이벤트 및 그것은 내가 무엇을 필요로하지 않는, 완전히 표시 된 폼의 스크린 샷을 찍고있다 .OshShown() 이벤트 처리기 내부에서 스크린 샷을 찍을 때 폼 전에 표시 이벤트가 비어 있음을 의미하는 빈 이미지가 있어요. 화면에 완전히 표시됩니다. –

관련 문제