Au risque de ressembler à un noob total, comment implémenter ISynchronizeInvoke sur un System.Timers.Timer?C# ISynchronizeInvoke Question
J'ai une classe (pas d'interface utilisateur) qui effectue des appels à mciSendString. J'ai une minuterie qui est censée interroger l'état actuel. Tous les appels de la classe fonctionnent, mais pas ceux provenant de l'événement écoulé. Je l'ai retrouvé à un fil différent, mais je n'ai pas eu plus loin que ça. Je pense que j'ai besoin d'invoquer un délégué sur le même sujet que la classe, mais je n'ai pas encore eu de chance de l'accomplir.
Exemple de code:
[DllImport("winmm.dll")]
private static extern Int32 mciSendString(string command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
public cPlayer()
{
tmrPoll = new System.Timers.Timer(1000);
tmrPoll.Enabled = false;
tmrPoll.Elapsed += new ElapsedEventHandler(tmrPoll_tick);
}
public void tmrPoll_tick(object source, ElapsedEventArgs e)
{
Poll();
}
private void Poll()
{
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
tmrPoll.Stop();
int res = 0;
res = mciSendString("status MediaFile position", _sbBuffer, _sbBuffer.Capacity, IntPtr.Zero);
if (res == 0) _position = int.Parse(_sbBuffer.ToString());
if (res == 0)
{
Console.WriteLine("Position = " + _sbBuffer.ToString());
} else {
Console.WriteLine("Failed: Error " + res.ToString());
}
res = mciSendString("status MediaFile length", _sbBuffer, _sbBuffer.Capacity, IntPtr.Zero);
if (res == 0) Console.WriteLine("Length = " + _sbBuffer.ToString());
if (res == 0) _length = int.Parse(_sbBuffer.ToString());
res = mciSendString("status MediaFile mode", _sbBuffer, _sbBuffer.Capacity, IntPtr.Zero);
if (res == 0) Console.WriteLine("Mode = " + _sbBuffer.ToString());
}
private void SendCommand(string cmd)
{
mciSendString(cmd, null, 0, IntPtr.Zero);
Poll();
}
Pour plus de précisions, si je l'appelle de sendCommand (quel qu'il soit, Play, Stop, etc.), il fonctionne et le résultat du sondage() est ce que je pense . Lorsque la minuterie se déclenche, le résultat (res) est 263, ce qui correspond à MCIERR_INVALID_DEVICE_NAME
. Le threadID sur l'appel échoué est différent de celui qui réussit, c'est pourquoi j'ai pensé que je devais utiliser ISynchronizeInvoke.