Il y a une erreur étrange avec le minuteur et les formulaires.La minuterie ne coche pas jusqu'à la fermeture du formulaire
Je fais un éditeur pour le jeu. L'éditeur a deux formes - MainForm
et PreviewForm
. PreviewForm
contient uniquement le contrôle pour la sortie OpenGL (contrôle personnalisé basé sur GLControl d'OpenTK), nommé glSurface
. GlSurface a deux temporisateurs en ligne (Windows.Forms.Timer
) - un pour le rendu, et un pour mettre à jour l'état du jeu. Timers déclenche dans glSurface
la méthode Run(double updateRate, double frameRate)
. Donc, je veux montrer PreviewForm
et exécuter la mise à jour et le rendu de MainForm
. Mon code est:
PreviewForm = new PreviewForm();
PreviewForm.glSurface.Run(60d, 60d);
PreviewForm.Show(this); //Form is "modal"
corps de la méthode 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;
Timers est en cours d'initialisation en cas OnVisibleChanged:
protected override void OnVisibleChanged(EventArgs e)
{
...
RenderTimer = new Timer();
UpdateTimer = new Timer();
RenderTimer.Tick += RenderTick;
UpdateTimer.Tick += UpdateTick;
...
}
choses étranges commencent ici.
Lorsque PreviewForm
est affiché, rien ne se passe. MAIS quand je ferme ce formulaire, les deux minuteurs tirent leurs événements! J'ai testé pour l'interaction transversale possible, mais PreviewForm.InvokeRequired
et glSurface.InvokeRequired
sont tous les deux false
.
Aidez-moi à comprendre ce que vous pensez.
'PreviewForm.Show (this); // Le formulaire est "modal" 'La forme est" non "modale. ShowDialog le rendrait modal. – LarsTech
Il semble que vous démarrez les minuteurs avant de les créer. Et puis, quand vous les créez, vous ne les lancez pas. – LarsTech
'J'ai testé l'interaction possible entre les threads': utilisez-vous le multithreading? Windows.Forms.Timers sont conçus pour des applications à un seul thread. –