نمایش نتایج 1 تا 9 از 9

نام تاپیک: SoundPlayer in C#‎ + Yek Soal

  1. #1

    SoundPlayer in C#‎ + Yek Soal

    سلام. من چند تا سوال از سی شارپ دارم. خیلی ممنون میشم اگر جواب بدید.

    1- توی سی پلاس پلاس یه تابع داریم به نام Delay که کارش وقفه انداختن بین اجرای دستوراته طوری که CPU رو درگیر نمیکنه. معادلش در سی شارپ چیه؟ اگه باید از تایمر استفاده کنم، چگونه؟

    2- من یک کلاس دارم که کنترل های یک فرم در آن تعریف شده است. مثلا یک کنترل Label که public هم تعریف شده، رو میخوام در یک کلاس دیگه استفاده کنم. لازمه بگم که یک شی از کلاس اول ایجاد کردم و خواستم بصورت زیر خصوصیت Text لیبل را تنظیم کنم. ولی هیچ تغییری در اون لیبل نمیبینم! مشکل کجاست؟

    Class1 A = new Class1();
    A.label1.Text = "Ali";

    3- وقتی از System.Media.SoundPlayer استفاده میکنم میخواهم بدونم که فایل صوتی که load کردم چند ثانیه است؟ یعنی:

    SoundPlayer Player = new SoundPlayer();
    Player.SoundLocation = "آدرس فایل";

    حالا این فایلی که لود شده، چند ثانیه است؟

    4- سوال چهارم در رابطه با سوال سومه. وقتی یک فایل لود شد، آیا میشه کاری کرد که دستورات متوقف بشه تا کل فایل پخش بشه و سپس دستورات ادامه پیدا کنه؟!

    ---------------------------
    توضیحات بیشتر:

    در مورد سوال دوم:
    من بخش هایی از برنامه رو اینجا کپی میکنم.
    برنامه Form1:
    f های اضافی رو در نظر نگیرید . برای اصلاح ادیتور گذاشتمشون. ضمنا آکولادها هم برعکس نشون داده شده. }{
    publicpartialclassForm1 : Form
    }
    public Form1() f
    {
    InitializeComponent();
    }
    privatevoid button1_Click(object sender, EventArgs e)
    {
    Class2 B = newClass2(); f
    B.Function(); f
    }
    -----------------------------------------------------------
    classClass2
    {
    publicvoid Function() f
    {
    Form1 C = newForm1(); f
    C.label1.Text = "Salam"; f
    }
    }
    staticclassProgram
    {
    ///
    /// The main entry point for the application.
    ///
    [STAThread]
    staticvoid Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(newForm1());
    }
    }
    -----------------------------------------------------------------------
    در Form Designer
    private System.Windows.Forms.Button button1;
    public System.Windows.Forms.Label label1;
    ولی با کلیک روی Button هیچ تغییری در label ایجاد نمیشه! واقعا چرا؟!
    ------------------------------------------------------------
    در مورد سوال سوم و چهارم:
    Duration متاسفانه وجود نداشت. در حقیقت چیزی که توی سوال چهارم میخوام ترکیب سوال یک و سه هستش. کد زیر رو ببینید تا بیشتر توضیح بدم:
    using System.Media;

    int x = 5;
    int y = 2;
    x = x*y;
    if( x==10 ){
    SoundPlayer Player = new SoundPlayer();
    Player.SoundLocation = "آدرس";
    Player.Play();
    x = 3;
    }
    y = 4;
    من میخوام دستوری باشه که وقتی Player.Play اجرا شد، کامپایلر اونقدر وایسه تا پخش فایل صوتی تموم بشه. یعنی باید به مدت زمان فایل صوتی متوقف بشه و x=3 انجام نشه. برای اینکار اگه بخوام خودم انجام بدم باید مدت زمان فایلی که داره پخش میشه رو بدونم تا با Sleep کامپایلر رو متوقف کنم. لازمه بگم که مدت زمان فایل صوتی رو از قبل نمیدونم و وقتی که لود شد باید بفهمم.
    امیدوارم منظورمو رسونده باشم. تو سوال چهار هم دقیقا همینو میخوام.
    اگه بتونید کمکم کنید که واقعا ممنون میشم.

  2. #2
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    1. استفاده از متد زیر برای یک ثانیه توقف:

    System.Threading.Thread.Sleep(1000);

    اگر واقعا احتیاج داشتید این کار رو بکنید چون میگن روش درستی نیست

    2. باید هم اینطور بشه، چون شیئ C که در متد Function ایجاد میکنید، با فرمی که در حال حاضر به نمایش گذاشته شده، فرق میکنه، باید کدتون رو به شکل دیگری تغییر بدید:

    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
    Class2 B = new Class2();
    B.Function(this);
    }
    }
    class Class2
    {
    public void Function(Form1 frm)
    {
    Form1 C = frm;
    C.label1.Text = "Salam";
    }
    }


    3. قبلا یک نگاه کرده بودم، به نظر نمیشه مقدار زمان کل آهنگ رو بدست آورد.
    بجاش از کنترل Windows Media Player استفاده کنید.

    4. بله باید از Threading استفاده کنید.

    من میخوام دستوری باشه که وقتی Player.Play اجرا شد، کامپایلر اونقدر وایسه تا پخش فایل صوتی تموم بشه. یعنی باید به مدت زمان فایل صوتی متوقف بشه و x=3 انجام نشه. برای اینکار اگه بخوام خودم انجام بدم باید مدت زمان فایلی که داره پخش میشه رو بدونم تا با Sleep کامپایلر رو متوقف کنم.
    پیشنهاد میکنم از Threading برای اینکار استفاده کنید :-)

  3. #3
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    برای استفاده از Threading به جای Sleep مثال زیر رو ببین که یک Console Application هست:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
    th.Start();
    th.Join();
    Console.WriteLine("It's will be write when th Thread completed.");
    Console.ReadKey();
    }

    static void DoWork()
    {
    for (int index = 0; index < 50; index++)
    Console.WriteLine(index);
    }
    }
    }

    کد فوق رو یکبار با متد Join و یکبار بدون متد Join اجرا کنید، خودتون متوجه میشید.

  4. #4
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    گفتم شاید بهتر باشه اصلا یک نمونه برات بگذارم!
    به جای متد Play باید از PlaySync استفاده کنید.
    برنامه منتظر میماند تا کار پخش SoundPlayer تمام بشه:

    SoundPlayer sound = new SoundPlayer("winSpaceSysStart.wav");
    System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(sound.PlaySync));
    th.Start();
    th.Join();
    MessageBox.Show("Finish");

  5. #5
    نقل قول نوشته شده توسط PC2st.ir مشاهده تاپیک
    1. استفاده از متد زیر برای یک ثانیه توقف:

    System.Threading.Thread.Sleep(1000);
    اگر واقعا احتیاج داشتید این کار رو بکنید چون میگن روش درستی نیست

    سلام.
    دقت کنید که من گفتم استفاده از Sleep برای همزمان کردن Thread ها، صحیح نیست. یعنی اینکه بگید اینجا یه وقفه میندازم که فلان چیز برسه انجام بشه و ... و الا اگر هدف فقط ایجاد وقفه باشه که خوب مشکلی نیست. :)

  6. #6
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    نقل قول نوشته شده توسط mehdi6755
    دقت کنید که من گفتم استفاده از Sleep برای همزمان کردن Thread ها، صحیح نیست. یعنی اینکه بگید اینجا یه وقفه میندازم که فلان چیز برسه انجام بشه و ... و الا اگر هدف فقط ایجاد وقفه باشه که خوب مشکلی نیست. :)
    آهان،...!
    الان دقت کردم فهمیدم منظورتون چی بوده
    بله، کاملا موافقم.

  7. #7
    نقل قول نوشته شده توسط PC2st.ir مشاهده تاپیک
    گفتم شاید بهتر باشه اصلا یک نمونه برات بگذارم!
    به جای متد Play باید از PlaySync استفاده کنید.
    برنامه منتظر میماند تا کار پخش SoundPlayer تمام بشه:

    SoundPlayer sound = new SoundPlayer("winSpaceSysStart.wav");
    System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(sound.PlaySync));
    th.Start();
    th.Join();
    MessageBox.Show("Finish");
    واقعا ممنون از راهنماییهاتون. خیلی کمکم کرد. فقط یه سوال دارم و اون اینه که من میخوام از این Thread در چند جای برنامه استفاده کنم. یعنی فایل ها مختلفی رو اجرا کنم. یک بار بالای برنامه این رو نوشتم:

    SoundPlayer Player = newSoundPlayer();
    System.Threading.Thread th = new System.Threading.Thread(
    new System.Threading.ThreadStart(Player.PlaySync));


    بعد در جاهای مختلف برنامه این کد رو نوشتم:

    Player.SoundLocation = "آدرس فایل";
    th.Start();
    th.Join();


    ولی با چنین خطایی در حین اجرا روبرو میشم:

    Thread is running terminated; it cannot restart

    ولی اینطوری حل میشه:

    th = new System.Threading.Thread(
    new System.Threading.ThreadStart(Player.PlaySync));


    میدونم که باید اینکارو هردفعه انجام بدم. ولی دو تا سوال دارم:

    1- بدون روش بالا ، کاری نمیشه کرد؟ مگه این Thread کارش Play کردن فایل صوتی که در آدرس Player هستش نیست؟ (ببخشید اگه سوال غیر حرفه ای میکنم! چون با Thread ها خیلی آشنا نیستم. ولی اگه برام توضیح بدین ممنون میشم.)

    2- با اینکه ابتدا و انتهای فایل های صوتی ، فضای خالی نیست (کل تایم فایل پره) ، ولی فاصله بین پخش دو Thread چندان جالب نیست. چیزی حدود یک ثانیه وقفه میفته بین پخش دو فایل. دلیل چی میتونه باشه؟

  8. #8
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491
    دوست عزیز؛ بحث رو خیلی کلی نگاه کرده بودم و به جواب سوال شما خیلی کلی جواب داده بودم، بعبارت دیگه Thread لازم نیست و همون متد PlaySync کفایت میکنه، یعنی مثلا:

    SoundPlayer Player;
    Player = new SoundPlayer();
    Player.SoundLocation = "start.wav";
    Player.PlaySync();
    Player.PlaySync();
    Player.PlaySync();
    Player.PlaySync();


    با اینکه ابتدا و انتهای فایل های صوتی ، فضای خالی نیست (کل تایم فایل پره) ، ولی فاصله بین پخش دو Thread چندان جالب نیست. چیزی حدود یک ثانیه وقفه میفته بین پخش دو فایل. دلیل چی میتونه باشه؟
    از همین Thread ها امتحان کردم، فاصله ای نمیافته، مگر اینکه کار بخصوصی کرده باشید.

  9. #9

    نقل قول: SoundPlayer in C#‎ + Yek Soal

    با سلام وخسته نباشيد

    خواهش ميكنم به اين سوال من جواب بديد


    من تازه برنامه نويسي با #cشروع كردم
    ولي ميخواستم يه پروژه اي ايجاد كنم كه مثل يه پيانوي ساده عمل كنه
    يعي با زدن مثلا هر دكمه از 7 دكمه ي اين پيانوي ساده ،نت هاي مربوط به هر كدوم نواخته بشن
    ميشه منو راهنمايي كنيد كه اول اينكه چه طور بايد اون صداهاي مربوط به هر نت مربوط به هر كليد رو ايجاد كنم؟و بعد چه طور اجرا شون كنم
    من تو اينترنت دنبال پيدا كردن جوابم گشتم.ولي با كدهايي خيلي زياد در حد 2000 خط مواجه شدم كه تقريبا نميدونم چي كار ميكنن
    ميشه منو راهنمايي كنيد براي توليد اين صدا ها يا به عبارتي نواختن نت ها........
    .باتشكر فراوان تر از حد معمول

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •