PDA

Просмотр полной версии : [Помогите!] Вывод названия трека в Лейбл C#


OneShot
08.12.2011, 05:32
В кратце суть проблемы, пишу проигрыватель на основе библиотек WindowsMedia, нужно чтобы в лейбл выводилось название трека который играет в данный момент

Есть функция которая выводит название:
label2.Text = WMP.currentPlaylist.Item[0].name;

Только вот куда её втыкать в моем коде чтобы корректно работала и обновляла свое содержание в режиме реального времени, а не от кликанья по баттонам?

Код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication15
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
label1.Text = "Volume 100";
WMP.uiMode = "none";



}

private void buttun1_Click(object sender, EventArgs e)
{

WMP.URL = @"[Ссылки могут видеть только зарегистрированные и активированные пользователи]";

}

private void trackBar1_Scroll(object sender, EventArgs e)
{
label1.Text = "Volume " + trackBar1.Value.ToString();
WMP.settings.volume = trackBar1.Value;

}

private void Form1_Load(object sender, EventArgs e)
{

}

private void WMP_Enter(object sender, EventArgs e)
{

}





}
}


З.ы изучаю си совсем недавно, поэтому не грамотный еще в этой области/kidding

Добавлено через 10 часов 26 минут
ап

Добавлено через 17 часов 44 минуты
вверх!

OneShot
10.12.2011, 07:03
UP!UP!Помогите

cowcancry
10.12.2011, 19:12
Просто выполняешь своё действие в отдельном потоке сразу с небольшой задержкой, подключаешь
using System.Threading;
И где-нибудь в главной части:

Thread T = new Thread(delegate()
{
while(true) // бесконечный цикл
{
label2.Text = WMP.currentPlaylist.Item[0].name;
Thread.Sleep(300); // каждые 300 мс будет обновляться название
}
});
T.IsBackground = true; // делаем поток фоновым.
T.Start(); // запускаем работу потока
Так делать не совсем хорошо, потому что наш поток будет обращатся к контролу, который был создан в другом потоке, но код работать будет :)

OneShot
11.12.2011, 01:44
Просто выполняешь своё действие в отдельном потоке сразу с небольшой задержкой, подключаешь
using System.Threading;
И где-нибудь в главной части:

Thread T = new Thread(delegate()
{
while(true) // бесконечный цикл
{
label2.Text = WMP.currentPlaylist.Item[0].name;
Thread.Sleep(300); // каждые 300 мс будет обновляться название
}
});
T.IsBackground = true; // делаем поток фоновым.
T.Start(); // запускаем работу потока
Так делать не совсем хорошо, потому что наш поток будет обращатся к контролу, который был создан в другом потоке, но код работать будет :)

А есть еще способы?

Добавлено через 1 час 51 минуту
Не работает, говорит элемент (label2) не в этом потоке создан
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "label2" не из того потока, в котором он был создан.

cowcancry
11.12.2011, 14:01
В дебаге оно будет вылетать, а если просто запускать программу, то всё будет хорошо. Чуть позже, напишу потоко-безопасный вариант.
Другой вариант, если есть в программе какое-нибудь событие при смене песни, то использовать его

Добавлено через 28 минут
MSDN ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) тут правильное обращение через делегат.

•theSaboteur•
11.12.2011, 14:33
А есть еще способы?

Добавлено через 1 час 51 минуту
Не работает, говорит элемент (label2) не в этом потоке создан
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "label2" не из того потока, в котором он был создан.

Просто в потоке к контролам обращайся через метод бегин инвоук твоей формы(/контрола).
Example:
this.BeginInvoke(
new Action(()=>
{
lalbel1.Text = "...";
}));
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..

OneShot
11.12.2011, 15:52
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..
Может и реализованы, но я не знаю как, гугл молчит по этой теме!

•theSaboteur•
11.12.2011, 16:00
Может и реализованы, но я не знаю как, гугл молчит по этой теме!

Через интеллисэнс покопайся в классе) - Порой очень действенно)/problem

OneShot
11.12.2011, 16:22
Через интеллисэнс покопайся в классе) - Порой очень действенно)/problem

Даже если чтото накопаю, как сделать чтобы работало? Мне бы на примере, я уже что только не пробывал, можно сделать только через клик по баттону или другое событие, а чтобы автоматически выводил, немогу!

•theSaboteur•
11.12.2011, 16:25
Может и реализованы, но я не знаю как, гугл молчит по этой теме!

Через интеллисэнс покопайся в классе) - Порой очень действенно)/problem

OneShot
12.12.2011, 08:07
Просто в потоке к контролам обращайся через метод бегин инвоук твоей формы(/контрола).
Example:
Код:

this.BeginInvoke(
new Action(()=>
{
lalbel1.Text = "...";
}));

p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..
Можешь показать на примере моего кода? я C# недавно совсем юзаю =)

Добавлено через 46 минут
В дебаге оно будет вылетать, а если просто запускать программу, то всё будет хорошо. Чуть позже, напишу потоко-безопасный вариант.
Другой вариант, если есть в программе какое-нибудь событие при смене песни, то использовать его
Программа вылетает с ошибкой

Добавлено через 1 час 16 минут
Просто в потоке к контролам обращайся через метод бегин инвоук твоей формы(/контрола).
Example:
this.BeginInvoke(
new Action(()=>
{
lalbel1.Text = "...";
}));
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..

Контекст 0x2ef108" отключен. Освобождение интерфейсов из текущего контекста (контекст 0x2eef98). Это может вызвать повреждение или потерю данных. Для исключения этой проблемы убедитесь в том, что все контексты/апартаменты еще существуют до полного завершения приложением использования RuntimeCallableWrappers, представляющих находящиеся в них COM-компоненты.

Если не в дебаге, то прога просто зависает

•theSaboteur•
12.12.2011, 14:42
Можешь показать на примере моего кода? я C# недавно совсем юзаю =)

Добавлено через 46 минут

Программа вылетает с ошибкой

Добавлено через 1 час 16 минут




Если не в дебаге, то прога просто зависает

А что ты собственно пытаешься сделать?))


string lastTrack; //ГЛОБАЛЬНАЯ переменная, содержащая последний трек

public void checkName()
{
lastTrack = /*перед входом в цикл, назначаешь этой переменной название текущего трека*/;
loop:
if( /*WMP..... текущий трек короче*/ != lastTrack)
{
this.BeginInvoke(()=>{
label1.Text = lastTrack = /*текущий трек*/;
});
}
goto loop;
}

А вообще, тебе уже говорили - лучше прошерстить msdn на предмет событий паузы/остановки/проигрывания/смены дорожки и т.п.