В кратце суть проблемы, пишу проигрыватель на основе библиотек 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 = @"http://online.vladivostok.fm:8000/rock";
}
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)
{
}
}
}
З.ы изучаю си совсем недавно, поэтому не грамотный еще в этой области
Добавлено через 10 часов 26 минут
ап
Добавлено через 17 часов 44 минуты
вверх!
________________ [Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось OneShot; 09.12.2011 в 00:17.
Причина: Добавлено сообщение
Просто выполняешь своё действие в отдельном потоке сразу с небольшой задержкой, подключаешь
Код:
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" не из того потока, в котором он был создан.
________________ [Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось OneShot; 11.12.2011 в 04:37.
Причина: Добавлено сообщение
В дебаге оно будет вылетать, а если просто запускать программу, то всё будет хорошо. Чуть позже, напишу потоко-безопасный вариант.
Другой вариант, если есть в программе какое-нибудь событие при смене песни, то использовать его
Добавлено через 28 минут
[Ссылки могут видеть только зарегистрированные пользователи. ] тут правильное обращение через делегат.
________________
Хэшкрякер для zhyk.ru
Последний раз редактировалось cowcancry; 11.12.2011 в 15:30.
Причина: Добавлено сообщение
Добавлено через 1 час 51 минуту
Не работает, говорит элемент (label2) не в этом потоке создан
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "label2" не из того потока, в котором он был создан.
Просто в потоке к контролам обращайся через метод бегин инвоук твоей формы(/контрола).
Example:
Код:
this.BeginInvoke(
new Action(()=>
{
lalbel1.Text = "...";
}));
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..
Может и реализованы, но я не знаю как, гугл молчит по этой теме!
________________ [Ссылки могут видеть только зарегистрированные пользователи. ]
Может и реализованы, но я не знаю как, гугл молчит по этой теме!
Через интеллисэнс покопайся в классе) - Порой очень действенно)
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Через интеллисэнс покопайся в классе) - Порой очень действенно)
Даже если чтото накопаю, как сделать чтобы работало? Мне бы на примере, я уже что только не пробывал, можно сделать только через клик по баттону или другое событие, а чтобы автоматически выводил, немогу!
________________ [Ссылки могут видеть только зарегистрированные пользователи. ]
Может и реализованы, но я не знаю как, гугл молчит по этой теме!
Через интеллисэнс покопайся в классе) - Порой очень действенно)
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Просто в потоке к контролам обращайся через метод бегин инвоук твоей формы(/контрола).
Example:
Код:
this.BeginInvoke(
new Action(()=>
{
lalbel1.Text = "...";
}));
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..
Можешь показать на примере моего кода? я C# недавно совсем юзаю =)
Добавлено через 46 минут
Цитата:
Сообщение от cowcancry
В дебаге оно будет вылетать, а если просто запускать программу, то всё будет хорошо. Чуть позже, напишу потоко-безопасный вариант.
Другой вариант, если есть в программе какое-нибудь событие при смене песни, то использовать его
Программа вылетает с ошибкой
Добавлено через 1 час 16 минут
Цитата:
Сообщение от •theSaboteur•
Просто в потоке к контролам обращайся через метод бегин инвоук твоей формы(/контрола).
Example:
Код:
this.BeginInvoke(
new Action(()=>
{
lalbel1.Text = "...";
}));
p.s. Код предполагает что действия выполняются в классе формы.
p.p.s. В dx sdk в подобных классах реализованы события вроде паузы/проигрыша, думаю в вмплеере такое тоже должно быть. А то все-таки некрасиво это дело выглядит..
Цитата:
Контекст 0x2ef108" отключен. Освобождение интерфейсов из текущего контекста (контекст 0x2eef98). Это может вызвать повреждение или потерю данных. Для исключения этой проблемы убедитесь в том, что все контексты/апартаменты еще существуют до полного завершения приложением использования RuntimeCallableWrappers, представляющих находящиеся в них COM-компоненты.
Если не в дебаге, то прога просто зависает
________________ [Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось OneShot; 12.12.2011 в 10:24.
Причина: Добавлено сообщение
Можешь показать на примере моего кода? я C# недавно совсем юзаю =)
Добавлено через 46 минут
Программа вылетает с ошибкой
Добавлено через 1 час 16 минут
Если не в дебаге, то прога просто зависает
А что ты собственно пытаешься сделать?))
Код:
string lastTrack; //ГЛОБАЛЬНАЯ переменная, содержащая последний трек
public void checkName()
{
lastTrack = /*перед входом в цикл, назначаешь этой переменной название текущего трека*/;
loop:
if( /*WMP..... текущий трек короче*/ != lastTrack)
{
this.BeginInvoke(()=>{
label1.Text = lastTrack = /*текущий трек*/;
});
}
goto loop;
}
А вообще, тебе уже говорили - лучше прошерстить msdn на предмет событий паузы/остановки/проигрывания/смены дорожки и т.п.
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).