Я хочу создать 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
, но я получаю те же результаты.Что я делаю не так?