c# asynchroniczne nasłuchiwanie klawiatury

0

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1