В кратце суть проблемы, пишу проигрыватель на основе библиотек 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
{
З.ы изучаю си совсем недавно, поэтому не грамотный еще в этой области/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 на предмет событий паузы/остановки/проигрывания/смены дорожки и т.п.