2014-01-29 129 views
1

我想在F#中製作遊戲循環,但我遇到了問題。F#Windows窗體遊戲循環

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);() 

如果我添加異步此循環不會執行。如果我將這個循環同步,它將永遠運行。

我想要的是讓循環在第二個線程中全部工作,並且每30ms重繪一次遊戲並處理keyevents。

回答

4

您需要使用Async.RunSynchronouslystartGame實際開球異步:

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

確定THX。我使用Async.StartAsTask,因爲我有死鎖與同步運行。 – Luffy

+0

有道理 - 我錯誤地認爲你想等待它在'startGame'中完成。 –