상당히 긴 프로세스 실행으로 진행 메시지를 보여주는 양식이 있습니다. 웹 서비스에 대한 호출이므로 진행률 표시 줄에 전체 백분율을 의미있게 표시 할 수는 없습니다. (진행률 막대의 선택 윤곽 속성이 특히 마음에 들지 않습니다)
프로세스에 일부 활동의 느낌을주기 위해 애니메이션 GIF를 표시하고 싶습니다 (예 : Windows 복사 프로세스와 같이 한 컴퓨터에서 다른 컴퓨터로 파일이 이동하는 파일).
어떻게합니까?
상당히 긴 프로세스 실행으로 진행 메시지를 보여주는 양식이 있습니다. 웹 서비스에 대한 호출이므로 진행률 표시 줄에 전체 백분율을 의미있게 표시 할 수는 없습니다. (진행률 막대의 선택 윤곽 속성이 특히 마음에 들지 않습니다)
프로세스에 일부 활동의 느낌을주기 위해 애니메이션 GIF를 표시하고 싶습니다 (예 : Windows 복사 프로세스와 같이 한 컴퓨터에서 다른 컴퓨터로 파일이 이동하는 파일).
어떻게합니까?
답변:
너무 어렵지 않습니다.
고려해야 할 사항 :
애니메이션 GIF :
애니메이션 GIF를 찾는 경우 다음을 생성 할 수 있습니다.
그것을하는 또 다른 방법 :
내가 잘 작동하는 또 다른 방법은 코드 프로젝트 에서 찾은 비동기 대화 상자 컨트롤입니다.
Application.DoEvents();
됩니다. 가능한 방법은 : 비즈니스 로직 뭔가가 부분적으로 다음, 완료를 업데이트 할 수 있습니다 및 애니메이션 Application.DoEvents () 업데이트 할 수 있습니다 어떤 (예를 진행률 표시 줄 또는 백분율) 속성 이벤트를 발생
나는 같은 문제가 있었다. 백그라운드에서 작동하는 긴 작업으로 인해 전체 양식 (gif 포함)이 다시 그려지지 않습니다. 여기에 내가 이것을 해결 한 방법이 있습니다.
private void MyThreadRoutine()
{
this.Invoke(this.ShowProgressGifDelegate);
//your long running process
System.Threading.Thread.Sleep(5000);
this.Invoke(this.HideProgressGifDelegate);
}
private void button1_Click(object sender, EventArgs e)
{
ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
Thread myThread = new Thread(myThreadStart);
myThread.Start();
}
이 작업을 담당 할 다른 스레드를 만들었습니다. 이 초기 형식 덕분에 문제없이 계속 다시 그릴 수 있습니다 (gif 작업 포함). ShowProgressGifDelegate 및 HideProgressGifDelegate는 gif가있는 pictureBox의 visible 속성을 true / false로 설정하는 형식의 대리자입니다.
Windows에서는 전통적으로 애니메이션 GIF를 사용하지 않지만 AVI 애니메이션은 거의 사용하지 않습니다. Windows 기본 컨트롤은 표시하기 만합니다. 애니메이션 GIF를 AVI로 (또는 그 반대로) 변환하는 도구도 있습니다.
System.Windows.Forms.PictureBox
컨트롤에서 지원하는 경우 애니메이션 GIF 만 사용합니다.
동일한 스레드에 있기 때문에 모든 것이 중지되기 때문에 긴 작업을 시작하지 않아도됩니다.
Public Class Form1
Private animatedimage As New Bitmap("C:\MyData\Search.gif")
Private currentlyanimating As Boolean = False
Private Sub OnFrameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.Invalidate()
End Sub
Private Sub AnimateImage()
If currentlyanimating = True Then
ImageAnimator.Animate(animatedimage, AddressOf Me.OnFrameChanged)
currentlyanimating = False
End If
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
AnimateImage()
ImageAnimator.UpdateFrames(animatedimage)
e.Graphics.DrawImage(animatedimage, New Point((Me.Width / 4) + 40, (Me.Height / 4) + 40))
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BtnStop.Enabled = False
End Sub
Private Sub BtnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStop.Click
currentlyanimating = False
ImageAnimator.StopAnimate(animatedimage, AddressOf Me.OnFrameChanged)
BtnStart.Enabled = True
BtnStop.Enabled = False
End Sub
Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click
currentlyanimating = True
AnimateImage()
BtnStart.Enabled = False
BtnStop.Enabled = True
End Sub
End Class
나는 같은 문제가 있었고 여러 가지 다른 문제에 직면했던 것을 구현함으로써 다른 솔루션을 발견했습니다. 마지막으로, 아래는 다른 게시물의 일부 조각을 모아서 예상대로 작동했습니다.
private void btnCompare_Click(object sender, EventArgs e)
{
ThreadStart threadStart = new ThreadStart(Execution);
Thread thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
PictureBox 컨트롤을 호출하는 Execution 메서드는 다음과 같습니다.
private void Execution()
{
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
Application.DoEvents();
// Your main code comes here . . .
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}
PictureBox는 속성 창에서 보이지 않거나 아래에서 수행하십시오.
private void ComparerForm_Load(object sender, EventArgs e)
{
pictureBox1.Visible = false;
}