تشغيل صوت، الانتظار حتى ينتهي، ثم القيام بشيء ما؟

StackOverflow https://stackoverflow.com/questions/148676

سؤال

أنا أكتب أ نماذج ويندوز التطبيق الذي من المفترض أن يقوم بتشغيل ثلاثة ملفات صوتية وفي نهاية كل ملف صوتي، يتم تغيير مصدر الصورة.

يمكنني الحصول عليه لتشغيل الأصوات باستخدام System.Media.SoundPlayer.ومع ذلك، يبدو أنه يتم تشغيل الصوت في موضوع مختلف، ويستمر.

التأثير الصافي لذلك هو تشغيل الصوت الأخير فقط وتغيير كافة الصور.

لقد حاولت Thread.Sleep, ، لكنه ينام واجهة المستخدم الرسومية بأكملها وبعد فترة النوم يحدث كل شيء مرة واحدة وآخر صوت تم تشغيله.

تحديث

اعتقدت أن PlaySynch كان يعمل، ولكن يبدو أنه قام بتجميد واجهة المستخدم الرسومية الخاصة بي، وهو أمر أقل من المثالي.ماذا يمكنني أن أفعل؟

هل كانت مفيدة؟

المحلول

هل جربت طريقة SoundPlayer.PlaySync؟من المساعدة:

تستخدم طريقة playsync مؤشر الترابط الحالي لتشغيل ملف .wav ، مما يمنع مؤشر الترابط من التعامل مع الرسائل الأخرى حتى يكتمل التحميل.

نصائح أخرى

بدلاً من استخدام أسلوب التشغيل، استخدم بلاي سينك طريقة.

استخدم هذا الرمز:

[DllImport("WinMM.dll")]
public static extern bool  PlaySound(byte[]wfname, int fuSound);

//  flag values for SoundFlags argument on PlaySound
public static int SND_SYNC        = 0x0000;      // Play synchronously (default).
public static int SND_ASYNC       = 0x0001;      // Play asynchronously.
public static int SND_NODEFAULT   = 0x0002;      // Silence (!default) if sound not found.
public static int SND_MEMORY      = 0x0004;      // PszSound points to a memory file.
public static int SND_LOOP        = 0x0008;      // Loop the sound until next sndPlaySound.
public static int SND_NOSTOP      = 0x0010;      // Don't stop any currently playing sound.
public static int SND_NOWAIT      = 0x00002000;  // Don't wait if the driver is busy.
public static int SND_ALIAS       = 0x00010000;  // Name is a registry alias.
public static int SND_ALIAS_ID    = 0x00110000;  // Alias is a predefined ID.
public static int SND_FILENAME    = 0x00020000;  // Name is file name.
public static int SND_RESOURCE    = 0x00040004;  // Name is resource name or atom.
public static int SND_PURGE       = 0x0040;      // Purge non-static events for task.
public static int SND_APPLICATION = 0x0080;      // Look for application-specific association.
private Thread t; // used for pausing
private string bname;
private int soundFlags;

//-----------------------------------------------------------------
public void Play(string wfname, int SoundFlags)
{
    byte[] bname = new Byte[256];    //Max path length
    bname = System.Text.Encoding.ASCII.GetBytes(wfname);
            this.bname = bname;
            this.soundFlags = SoundFlags;
            t = new Thread(play);
            t.Start();
}
//-----------------------------------------------------------------

private void play()
{
    PlaySound(bname, soundFlags)
}

public void StopPlay()
{
    t.Stop();
}

public void Pause()
{
    t.Suspend(); // Yeah, I know it's obsolete, but it works.
}

public void Resume()
{
    t.Resume(); // Yeah, I know it's obsolete, but it works.
}

ما تريد القيام به على الأرجح هو إصدار صوت غير متزامن، ولكن بعد ذلك قم بتعطيل واجهة المستخدم الخاصة بك بطريقة لا تستجيب لاستجابة المستخدم.ثم بمجرد تشغيل الصوت، يمكنك إعادة تمكين واجهة المستخدم الخاصة بك.سيسمح لك هذا بمواصلة رسم واجهة المستخدم كالمعتاد.

لقد اكتشفت كيفية القيام بذلك.لقد استخدمت PlaySynch، لكنني قمت بالتشغيل في سلسلة رسائل منفصلة للرمز الذي يرسم واجهة المستخدم.يقوم نفس الموضوع أيضًا بتحديث واجهة المستخدم بعد تشغيل كل ملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top