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

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

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

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

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

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

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

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

3
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
04.03.2012, 10:32
Наверное показать код. Нет? Телепатов нету. Могу подсказать так:
C#
1
if (sndSignal != null && !sndSignal.Thrd.IsAlive)
1
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 81
05.03.2012, 16:40  [ТС]
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
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
05.03.2012, 19:26
Отладкой пользуешься? Ну пошагово проходы по коду делаешь смотря при этом какие переменные какие значения имеют, например, что вместо ожидаемого имеет null и т.д?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2012, 19:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru