Пользовательский элемент управления, который использует новый поток - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу создать UserControl с именем GameControl, который создает новый поток при загрузке и имеет Panel, который будет содержать игровую графику.Новый поток будет запущен во время цикла, который обновляет GameObjects и вызывает panel1.Invalidadte() для перекраски панели.

public partial class GameControl : UserControl
{
    int posX = 0;
    DemoState demoState = DemoState.run;

    //Threading
    public delegate void DelegateDemo();
    ThreadStart threadStart;
    Thread runDemoThread;

    public GameControl(String config)
    {
        InitializeComponent();
        /*InitizalizNewGameObjects(config);*/
    }

    private void GameControl_Load(object sender, EventArgs e)
    {
        threadStart = new ThreadStart(StartThread);
        runDemoThread = new Thread(threadStart);
        runDemoThread.Name = "DemoThread";
        runDemoThread.Start();
    }

    private void StartThread()
    {
        var delegateDemo = new DelegateDemo(RunDemo);
        this.panel1.BeginInvoke(delegateDemo);
    }

    private void RunDemo()
    {
        while (demoState != DemoState.stop) {
            Thread.Sleep(500);
            switch (demoState)
            {
                case DemoState.run:
                    /*UpdateGameObjects();*/
                    posX++;
                    break;
                default:
                    demoState = DemoState.stop;
                    break;
            }
            panel1.Invalidate();
        }
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        //Daw posX's value in the panel
        String drawString = Thread.CurrentThread.Name + " " + posX.ToString();
        Font drawFont = new Font("Arial", 16);
        SolidBrush drawBrush = new SolidBrush(Color.Black);
        float x = 150.0F;
        float y = 50.0F;
        StringFormat drawFormat = new StringFormat();
        drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;
        e.Graphics.DrawString(drawString, drawFont, drawBrush, x, y, drawFormat);
        /*DrawGameObejects(e);*/
    }
}

Я копирую элемент управления в Form1 и добавляю его в TabPage следующим образом:

private void starToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (demo!=null)
        {
            return;
        }
        demo = new GameControl(RichTextboxNewConfig.Text);
        TabPageDemo.Controls.Add(demo);
    }

Я должен получить увеличивающееся число на моем экране, но все, что я получаю, это 0 и программа зависает, я провел некоторое тестирование и пришел к выводу, что он ожидает завершения потока.Я пытался использовать Task и BackgroundWorker, но я получаю те же результаты.Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...