Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#Windows窗体游戏循环_F# - Fatal编程技术网

F#Windows窗体游戏循环

F#Windows窗体游戏循环,f#,F#,我想在F#中进行游戏循环,但我有问题 let rec gameLoop (gamePanel:Panel) = async { (*redraw gemaPanel *) lock gamePanel ( fun() -> let graphics = gamePanel.CreateGraphics(); let rectangle = new System.Drawing.Rectangle(100, 100, 200, 200);

我想在F#中进行游戏循环,但我有问题

let rec gameLoop (gamePanel:Panel) =  async {
    (*redraw gemaPanel *)
    lock gamePanel ( fun() -> 
      let graphics = gamePanel.CreateGraphics();
      let rectangle = new System.Drawing.Rectangle(100, 100, 200, 200);
      graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
    ) 
    return! gameLoop (gamePanel:Panel)
    }

let startGame (p:Panel) (p1:Panel) = hide p; Async.StartAsTask(gameLoop p1);()
如果我添加async,这个循环将不会执行。如果我让这个循环同步,它将永远运行

我想要的是,有一个循环,它将在第二个线程中一直工作,并且将每隔30毫秒重新绘制游戏并处理关键事件。

您需要在
startGame
中使用它来实际启动异步:

let startGame (p:Panel) (p1:Panel) = hide p; Async.RunSynchronously (gameLoop p1)
您需要在
startGame
中使用,才能真正启动异步:

let startGame (p:Panel) (p1:Panel) = hide p; Async.RunSynchronously (gameLoop p1)

好的,谢谢。我使用Async.startask是因为我在同步运行时遇到死锁。有意义吗?我错误地认为您希望在
startGame
中等待它完成。好的,谢谢。我使用Async.startask是因为我在同步运行时遇到死锁。有意义吗?我错误地认为您希望在
startGame
中等待它完成。