Mam do wykonania aplikację która w pętli wykonuje pewne czynności (adaptacyjny ray-tracing), który jest wykonywany aż do momentu jego ukończenia (kilka sekund), albo** aż do momentu wciśnięcia**, któregoś z klawiszy przez użytkownika. W związku z tym standardowe podejście skutkuje tym w postaci KeyDownEventHandler powoduje, że klawisz zostanie wczytany dopiero po ukończeniu pętli a powinien w trakcie.
Jak zatem można to zrobić ? Domyślam się, że trzeba zrobić jeden wątek robiący pętlę a drugi do nasłuchiwania klawiatury. Jak ten drugi powinien wyglądać (nie jestem specjalista od c#).
0
0
Zrób w designerze button i label, a potem przypisz zdarzenia.
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;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
delegate void StringDelegate(string Text);
Thread thread;
public Form1()
{
InitializeComponent();
KeyPreview = true;
}
void Calculate()
{
//calculate wykonuje sie w osobnym watku
for (int i = 0; i < 100; i++)
{
SetText(String.Format("Liczymy {0} sekund.", i / 10f)); //nie mozemy tak po prostu wpisac tekstu do labela, bo jest on rysowany w innym watku
Thread.Sleep(100);
}
label1.Text = "Policzone";
}
void SetText(string text)
{
Invoke(new StringDelegate(s=> label1.Text = s), text);
}
protected override void OnClosing(CancelEventArgs e)
{
if (thread != null) thread.Abort();
}
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(Calculate);
thread.Start();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape && thread != null)
{
thread.Abort();
label1.Text = "Anulowano";
thread = null;
}
}
}
}
0
Swietne, dzieki.
A teraz pytanie za 100 punktow, jak zrobić delegat, który pozwoli nam na rysowanie po formie (czyli w wątku będziemy mogli się odwołać do Graphics formy)
0
Do przerysowania formy:
this.Invoke(new Action(() => Refresh()));
Rysuj w OnPaint, albo do bitmapy.