我想在c#中编写一个棋盘游戏,现在游戏应该工作的方式是游戏机制在单独的类(称为GameBoard)中从GUI,并且当按下GUI中的按钮时,它会发出脉冲,这应该由处理该动作的GameBoard检测到。线程不会在新线程中执行
我写了一个测试,通过在一个线程中运行“takeTurn”方法,设置指示哪个卡被点击并发送脉冲的静态变量,而不是等待来自“takeTurn “表示已完成播放该卡,以便我可以执行声明以确认我想播放的卡已播放。据我所知,线程正常执行,而不是线程。我在thread.Start()之后直接放置了一个print语句,但它没有执行,代码只是挂在一个等待语句上(我认为)。 这是测试代码:
Thread t = new Thread(new ThreadStart(p1.actionPhase));
t.Start();
Console.WriteLine("TEST: thread launched successfully");
GameBoard.lastCardPlayed = new Witch();
Console.Write("about to enter sync block.");
lock (GameBoard.syncObject){
Console.WriteLine("Entering sync block");
Thread.Sleep(5000);
Monitor.PulseAll(GameBoard.syncObject);
Console.WriteLine("Button pressed!");
Monitor.Wait(GameBoard.syncObject);
Console.WriteLine("finished waiting.");
}
Assert.IsTrue(p2.getDiscard().Contains(new Witch()));
这里是代码我测试:
public override void actionPhase()
{
lock (GameBoard.syncObject)
{
Console.WriteLine("PLAYER: Action Phase called on player " + getNumber());
Monitor.Wait(GameBoard.syncObject);
Console.WriteLine("PLAYER: Button pulse recieved.");
Card cardPlayed = GameBoard.lastCardPlayed;
playCard(cardPlayed);
Monitor.PulseAll(GameBoard.syncObject);
Console.WriteLine("PLAYER: finished playing card, pulse sent.");
Console.WriteLine("Playing a card with ID " + cardPlayed.getID());
}
}
测试之前输出的唯一的事挂断的“行动阶段号召玩家1”
您的方法实在太过时了,请看TAP https://msdn.microsoft.com/en-us/library/hh873175%28v=vs.110%29.aspx –
'Pulse'不会保存。如果有人在你不等待的时候发生脉搏,那么它就会迷路。 – PetSerAl
这就是为什么我使用Thread.Sleep,但代码甚至没有执行任何脉冲。 – icaughtfireonce