2011-08-27 12 views
0
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace d3 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      pictureBox1.Image = Image.FromFile("C:\\Users\\ocean\\Desktop\\deneme.png"); 
      pictureBox1.Location = new Point(0, 0); 
      pictureBox2.Image = Image.FromFile("C:\\Users\\ocean\\Desktop\\pul1.png"); 
     } 

     protected override void OnMouseClick(MouseEventArgs e) 
     { 
      Graphics theGraphics = Graphics.FromHwnd(this.Handle); 

      for (int i = 0; i < 200; i += 5) 
      { 
       pictureBox2.Location = new Point(i, 100); 
       theGraphics.Flush(); 

       System.Threading.Thread.Sleep(50); 
       pictureBox2.Invalidate(); 
      }   
     } 
    } 
} 

이 코드에서 picturebox2는 괜찮 으면 이동하지만 이전 위치 이미지는 계속 루프가 끝납니다. 루프가 완료되면 이전 부품이 지워집니다. 나는 단지 pictureBox1로 이동하려는 루프 안의 이전 그림을 원하지 않습니다. 임 C#에서 새로운 그래서 제발 도와주세요 :) J2ME에서 나는 flushgraphics를 사용하고 있었지만 여기서 시도하고 작동하지 않았다. 당신이 예제를 줄 수 있다면 나는 행복 할 것이다.다른 이미지로 이미지 이동

+1

대신, Thread.sleep를 가진 for 루프에서이 작업을 수행 이미지를 5 개 픽셀마다 이동 타이머로하지 않는다 50ms 후 정지합니다. 이렇게하면 변경 내용이 화면에 제대로 표시됩니다. – box86rowh

+0

이 코드는 폼의 PaintBackground 메서드를 실행할 수 없으므로 픽셀을 바꿔야합니다.이런 루핑은 결코 문제가되지 않습니다. 메시지 루프가 실행되지 않으면 물건이 제대로 작동하지 않습니다. 타이머 대신 this.Update()가 반창고입니다. –

답변

1

C#의 경우 Swing에서와 마찬가지로 UI 또는 이벤트 스레드를 사용중인 경우 사용자가 완료 할 때까지 변경된 내용이 사용자에게 표시되지 않습니다.

그래서 이동하려는 경우 가장 좋은 방법은 UI 스레드에서 내리고 새 스레드를 시작한 다음 루프를 진행하는 것입니다.

하지만 문제는 변경하기 위해 UI 스레드에 있어야한다는 것입니다.

이것이 수면이 작동하지 않는 이유입니다. 이벤트 스레드를 잠자기 상태로 두는 것입니다. btw.

사용중인 C# 버전은 무엇입니까? 스레드를 만드는 방법과 UI 스레드를 사용하는 방법에 대한 많은 옵션이 있습니다.

http://blogs.msdn.com/b/csharpfaq/archive/2004/03/17/91685.aspx을 : 여기 http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

는 UI 스레드에 다시 도착하는 방법을 처리하는 방법입니다 : 여기

는 쓰레드를 생성하는 링크입니다.

예를 들어, 내 스레드 나는 그것이 간단 무슨 일이 일어나고 있는지보고 발견하면이 방법을 http://www.rvenables.com/2009/01/threading-tips-and-tricks/

에서 온 당신이 할 수있는 스레드를 만들 수 있습니다.

(new Thread(() => { 
     DoLongRunningWork(); 
     MessageBox.Show("Long Running Work Finished!"); 
    }) { Name = "Long Running Work Thread", 
     Priority = ThreadPriority.BelowNormal }).Start(); 

이 문제 될 UI 스레드에 업데이 트를 수행하는 방법에 대한 가장 완전한 답변 :

How to update the GUI from another thread in C#?

UPDATE : 그것은에 내용의 일부를 들어

장시간 작업을하면 스레드 블록 앞에 다음을 추가 할 수 있습니다.

TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
원하는 변경을 단순화 할 수있는 이러한 변경함으로써

(new Task(() => 
    { 
     //copy pixel 
     pictureBox2.Invalidate(); // You may want to just invalidate a small block     around the pixel being changed, or every some number of changes. 
    })) 
.Start(uiScheduler); 

을하지만,이 중 일부는 내가 준 이유입니다, 당신이 원하는 것보다 더 복잡 할 수 있습니다

그런 다음 스레드 내에서이 작업을 수행 할 수 있습니다 더 많은 정보를 제공하는 다른 링크. 그러나, Task을 사용하는 방법에 대한 자세한 당신이 훌륭한 블로그를 볼 수 있습니다 :

http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/

+0

visual C# 2010 express edition은 j2me에서 인터페이스 인 실행 가능한 메소드에 썼기 때문에 예제 코드를 작성할 수 있습니까? 그 안에는 루프가 있지만 (실제로) 루프가 있고 마지막에는 스레드와 각 동작이 있습니다. flushGraphics를 작성했지만 C#에서는 잘 작동합니다. flushgraphics를 시도했지만, C#에서는 새로운 것이므로 예제를 작성할 수 있습니다. 코드를 작성해 주시면 감사하겠습니다. 방법에 의해 Thnx – albatross