PDA

View Full Version : مبتدی: مشکل در پخش چند صدا به طور متوالی



alireza.b
چهارشنبه 30 مرداد 1392, 12:16 عصر
سلام
این کد رو ببینید:
int lenght = richTextBox1.Text.Length;
char[] text = richTextBox1.Text.ToCharArray();
int i = 0;
while (lenght != 0)
{
switch (text[i].ToString())
{
case "ا":
alef.Play();
break;
case "ب":
be.Play();
break;
case "پ":
pe.Play();
break;
case "ت":
te.Play();
break;
case "ث":
se.Play();
break;
case "ج":
je.Play();
break;
case "چ":
che.Play();
break;
case "ح":
he.Play();
break;
case "خ":
khe.Play();
break;
case "د":
de.Play();
break;
case "ذ":
ze.Play();
break;
case "ر":
re.Play();
break;
case "ز":
ze.Play();
break;
case "ژ":
jeje.Play();
break;
case "س":
se.Play();
break;
case "ش":
she.Play();
break;
case "ص":
se.Play();
break;
case "ض":
ze.Play();
break;
case "ط":
te.Play();
break;
case "ظ":
ze.Play();
break;
case "ع":
ee.Play();
break;
case "غ":
ghe.Play();
break;
case "ف":
fe.Play();
break;
case "ق":
ghe.Play();
break;
case "ک":
ke.Play();
break;
case "گ":
ge.Play();
break;
case "ل":
le.Play();
break;
case "م":
me.Play();
break;
case "ن":
ne.Play();
break;
case "و":
ve.Play();
break;
case "ه":
he.Play();
break;
case "ی":
ye.Play();
break;
case " ":
space.Play();
break;
}
i++;
lenght--;
}
این کد وظیفه ی این رو داره که تک تک حروف داخل richTextBox را بخونه و با توجه به هر حرف صدای اون حرف رو پخش کنه
مشکل اینجاست که برنامه میاد و حرف اول رو می خونه و صدای مربوطه پخش می کنه اما صبر نمی کنه تا صدا تموم بشه و بعد بره و حرف دوم رو بخونه
بنابراین خیلی سریع همه ی حروف رو می خونه و پخش می کنه
این اتفاق باعث این میشه که فقط حرف آخر شنیده بشه چون وقته صدای جدیدی توسط برنامه پخش بشه طبیعتا صدای قبلی خاموش میشه
من می خوام کاری کنم که بعد از پخش هر صدا صبر کنه تا صدا تموم بشه و بعد دوباره به اول بلوک while برگرده
ببخشید که طولانی شد
لطفا کمکم کنید

matrix-program
چهارشنبه 30 مرداد 1392, 14:09 عصر
فکر کنم با thread مشکلتون حل بشه:چشمک:

alireza.b
چهارشنبه 30 مرداد 1392, 14:56 عصر
ممنون دوست عزیز
حل شد

مهرداد صفا
چهارشنبه 30 مرداد 1392, 19:06 عصر
سلام
این کد رو ببینید:
int lenght = richTextBox1.Text.Length;
char[] text = richTextBox1.Text.ToCharArray();
int i = 0;
while (lenght != 0)
{
switch (text[i].ToString())
{
case "ا":
alef.Play();
break;
case "ب":
be.Play();
break;
case "پ":
pe.Play();
break;
case "ت":
te.Play();
break;
case "ث":
se.Play();
break;
case "ج":
je.Play();
break;
case "چ":
che.Play();
break;
case "ح":
he.Play();
break;
case "خ":
khe.Play();
break;
case "د":
de.Play();
break;
case "ذ":
ze.Play();
break;
case "ر":
re.Play();
break;
case "ز":
ze.Play();
break;
case "ژ":
jeje.Play();
break;
case "س":
se.Play();
break;
case "ش":
she.Play();
break;
case "ص":
se.Play();
break;
case "ض":
ze.Play();
break;
case "ط":
te.Play();
break;
case "ظ":
ze.Play();
break;
case "ع":
ee.Play();
break;
case "غ":
ghe.Play();
break;
case "ف":
fe.Play();
break;
case "ق":
ghe.Play();
break;
case "ک":
ke.Play();
break;
case "گ":
ge.Play();
break;
case "ل":
le.Play();
break;
case "م":
me.Play();
break;
case "ن":
ne.Play();
break;
case "و":
ve.Play();
break;
case "ه":
he.Play();
break;
case "ی":
ye.Play();
break;
case " ":
space.Play();
break;
}
i++;
lenght--;
}
این کد وظیفه ی این رو داره که تک تک حروف داخل richTextBox را بخونه و با توجه به هر حرف صدای اون حرف رو پخش کنه
مشکل اینجاست که برنامه میاد و حرف اول رو می خونه و صدای مربوطه پخش می کنه اما صبر نمی کنه تا صدا تموم بشه و بعد بره و حرف دوم رو بخونه
بنابراین خیلی سریع همه ی حروف رو می خونه و پخش می کنه
این اتفاق باعث این میشه که فقط حرف آخر شنیده بشه چون وقته صدای جدیدی توسط برنامه پخش بشه طبیعتا صدای قبلی خاموش میشه
من می خوام کاری کنم که بعد از پخش هر صدا صبر کنه تا صدا تموم بشه و بعد دوباره به اول بلوک while برگرده
ببخشید که طولانی شد
لطفا کمکم کنید

با سلام.
به هر حال:
چرا switch؟ راه های زیادی برای استفاده به جای این همه case وجود دارد که یکی از ساده ترین آنها می تواند استفاده از Dictionary باشد. می توانید یک Dictionary<String,Player> تعریف کنید و حروف مورد نظر را به عنوان key به Dictionary بدهید. با این کار هر زمانی که نیاز به value متناظر با key یا همان حرفی که به عنوان key قرار دادید داشتید، فقط باید key یا حرف را به آن بدهید و ...
برای پخش صدا هم (اگر از System.Media.SoundPlayer استفاده می کنید) از متود PlaySync استفاده کنید تا caller thread تا اتمام فایل متوقف شود.
مثال:

Dictionary<string, SoundPlayer> player = new Dictionary<string, SoundPlayer>();
Environment.CurrentDirectory = "c:\\windows\\media\\";
player.Add("1", new SoundPlayer("chimes.wav"));
player.Add("2", new SoundPlayer("chord.wav"));
//...
Action<string> Play = (Action<string>) (k => player[k].PlaySync());
for (int i = 1; i < 3; i++)
Play(i.ToString());

alireza.b
شنبه 02 شهریور 1392, 20:57 عصر
میشه بیستر راجع به Collection و Dictionary توضیح بدین