計時器和表格存在一些奇怪的錯誤。計時器不會在表格關閉之前打勾
我正在編輯遊戲。編輯器有兩種形式 - MainForm
和PreviewForm
。 PreviewForm
只包含OpenGL輸出的控件(基於來自OpenTK的GLControl的自定義控件),名稱爲glSurface
。
glSurface有兩個內聯定時器(Windows.Forms.Timer
) - 一個用於渲染,另一個用於更新遊戲狀態。定時器在glSurface
方法Run(double updateRate, double frameRate)
中觸發。
所以,我想顯示PreviewForm
並從MainForm
運行更新和渲染。 我的代碼是:
PreviewForm = new PreviewForm();
PreviewForm.glSurface.Run(60d, 60d);
PreviewForm.Show(this); //Form is "modal"
身體Run
方法:
if (Running)
throw new Exception("Already run");
_updateRate = updateRate;
_renderRate = frameRate;
var renderFrames = Convert.ToInt32(1000/frameRate);
var updateFrames = Convert.ToInt32(1000/updateRate);
RenderTimer.Interval = renderFrames;
UpdateTimer.Interval = updateFrames;
RenderTimer.Start();
UpdateTimer.Start();
Running = true;
定時器在OnVisibleChanged事件初始化:
protected override void OnVisibleChanged(EventArgs e)
{
...
RenderTimer = new Timer();
UpdateTimer = new Timer();
RenderTimer.Tick += RenderTick;
UpdateTimer.Tick += UpdateTick;
...
}
奇怪的事情從這裏開始。
當PreviewForm
顯示時,沒有任何反應。但是當我關閉那個表格時,兩個定時器都會觸發它們的事件!我已經測試了可能的跨線程交互,但PreviewForm.InvokeRequired
和glSurface.InvokeRequired
都是false
。
請幫我弄清楚到底發生了什麼。
'PreviewForm.Show(本); //表單是「模態」形式是「不」模態。 ShowDialog會使它成爲模態。 – LarsTech
它看起來像你在創建它們之前啓動計時器。然後當你創建它們時,你不會啓動它們。 – LarsTech
'我已經測試過可能的跨線程交互':你在使用多線程嗎? Windows.Forms.Timers是爲單線程應用程序設計的。 –