0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 81
1

Как из одного потока узнать состояние другого потока

04.03.2012, 03:07. Показов 4989. Ответов 3
Метки нет (Все метки)

Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен.
Например, второй поток формируется в классе SoundSignal и имеет название Thrd (public Thread Thrd). Поток формируется в конструкторе этого класса.
Создаю глобальную переменную класса SoundSignal sndSignal;
Поток запускаю так: sndSignal = new SoundSignal("notify.wav"); // воспроизвести звуковой файл

Вопрос такой. Как из основного потока узнать, что поток sndSignal.Thrd пока не запущен?
Эта проверку делаю в таймере. Пишу if (!sndSignal.Thrd.IsAlive) .....
Вылетает ошибка: Ссылка на объект не указывает на экземпляр объекта
Что делать, подскажите?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2012, 03:07
Ответы с готовыми решениями:

Как получить данные из другого потока?
Здравствуйте. Приложение выполняется в 2 потока. В процессе выполнения необходимо получать данные...

Как поймать исключение из другого потока?
Пишу программу на C#. Суть программы - написать класс который анализирует файл и в случае не...

Как вывести данные в textbox из другого потока?
Добрый день, как вывести данные, допустим, в textbox из другого потока? TextBox t =...

Parallel.For внутри другого потока, как его завершить
Всем привет. У меня ест ьнекоторый вычислительный алгоритм, который выполняется при помощи...

3
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
04.03.2012, 10:32 2
Наверное показать код. Нет? Телепатов нету. Могу подсказать так:
C#
1
if (sndSignal != null && !sndSignal.Thrd.IsAlive)
1
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 81
05.03.2012, 16:40  [ТС] 3
Casper-SC,
Спасибо что ответили, но проблема та же.
Любое упоминание в таймере комбинации sndSignal.Thrd. приводит к ошибке Ссылка на объект не указывает на экземпляр объекта

Вот часть кода

C#
1
2
3
4
public partial class Form1 : Form
    {
      SoundSignal sndSignal; // создал клобальную переменную
..........................................
Класс, создающий дополнительный поток
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        class SoundSignal
        {
            string fileWay; // путь к звуковому файлу
            public Thread Thrd;
            bool done = false;
 
 
           public SoundSignal(string way, int countTick)
            {
                fileWay = way;
                Thrd = new Thread(this.Sound);
                Thrd.Start(countTick);
            }
 
           private void Sound(object countTick)
            {
                for (int i = 1; i <= (int)countTick; i++) // countTick - количество воспроизведений сигнала
                {
                    if (!done)
                    {
                        System.Media.SoundPlayer sp = new System.Media.SoundPlayer(fileWay);
                        sp.Play();
                        Thread.Sleep(4000);
                    }
                    return;
                }
           }
 
           public void StopSound()  
           {           
               done = true;
           }
        }
Таймер, который отслеживает время, и в начале нового часа выдает звуковой сигнал (короткий или длинный)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        // ТАЙМЕР tmrWin1
        private void timer1_Tick(object sender, EventArgs e)
        {
            // показать часы на форме
            this.Text = DateTime.Now.ToString("HH:mm:ss      dd MMMM yyyy   dddd"); ;
            int min = Convert.ToInt32(DateTime.Now.ToString("mm"));
            //int sec = Convert.ToInt32(DateTime.Now.ToString("ss"));
 
            if (sndSignal.Thrd.IsAlive) btnWin1_Stop.Hide(); // если потока Thrd нет, то не показывать кнопку btnWin1
 
            if ((min > 0) && (FlagWin1 == false)) FlagWin1 = true; // переходим в режим ожидания когда кол-во минут станет >0 
 
 
            if ((min == 0) && (FlagWin1) && (chboxWin1EveryHour.Checked)) // срабатывание сигнала если он разрешен chboxWin1EveryHour.Checked и стоит флаг
            {
 
                int countTick=100; // количество подаваемых сигналов (большой продолжительности)
                          if (rbtnWin1Once.Checked) countTick = 1; // одиночный сигнал
                     else if (rbtnWin1_Minute.Checked) countTick = 4; // 4 сигнала подряд
 
                     btnWin1_Stop.Show(); // показать кнопку остановки звукового сигнала
                         
                           sndSignal = new SoundSignal("notify.wav", countTick);// запустить поток сигнала                                       
 
                   FlagWin1 = false;
 
                
                
                // раскрыть трей если он был свернут и стоит разрешающая галочка
                if ((this.WindowState == FormWindowState.Minimized) && (chboxWin1OpenForm.Checked)) 
                {
                    if (this.WindowState == FormWindowState.Minimized)
                    {
                        this.WindowState = FormWindowState.Normal;
                        this.ShowInTaskbar = true;
                        notifyIcon1.Visible = false;
                    }
                }
 
 
            }
        }
Цель вопроса вот в чем:
Есть кнопка btnWin1_Stop . Нажатие на которую может остановить сигнал, не дожидаясь его полного окончания.

C#
1
2
3
4
        private void btnWin1_Stop_Click(object sender, EventArgs e)
        {
           sndSignal.StopSound();
        }
Мне нужно, что бы если есть звуковой поток, эта кнопка была на форме. Если потока нет - убиралась.

Пишу if (sndSignal.Thrd.IsAlive) btnWin1_Stop.Hide(); // если потока Thrd нет, то не показывать кнопку btnWin1. При запуске вылетает вышеуказанная ошибка. Проверка if sndSignal!=null не помогает

Добавлено через 3 часа 32 минуты
Хочу добавить, что хотелось бы отслеживать наличия потока не прибегая к глобальным переменным. Хотелось бы сделать класс SoundSignal полностью автономным.
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
05.03.2012, 19:26 4
Отладкой пользуешься? Ну пошагово проходы по коду делаешь смотря при этом какие переменные какие значения имеют, например, что вместо ожидаемого имеет null и т.д?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2012, 19:26
Помогаю со студенческими работами здесь

Как узнать, сколько свободного места есть в стеке потока?
Всем привет! Речь про использование такой &quot;замечательной&quot; штуки в C#, как stackalloc. Якобы...

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List&lt;SomeClass&gt; listSC, String fileName) { using...

Вывод формы из другого потока
Пишу клиент-сервер - в виде чата. ПОдскажите как вывести окно из другого потока... в потоке ...

Копирование в буфер из другого потока
Во время работы BаckGroundWorker'a нужно скопировать текстовую информацию в буфер. Делаю это с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru