Прекращение выполнения потока
От: Dimetrius Украина  
Дата: 26.02.07 22:39
Оценка:
Доброе время суток!
такая проблема...много поточное приложение! выполняется несколько потов-один управляющий-все остальные вспомагательные! управляющий имеет ссылки на объекты(Thread) всех вспомагательных объектов! каким образом из управляющего остановить выполнение заданного вспомагательного потока. Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать, а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!
заранее благодарен за ответ)
Re: Прекращение выполнения потока
От: WildMage Россия http://users.livejournal.com/_wildmage/
Дата: 27.02.07 04:26
Оценка:
Здравствуйте, Dimetrius, Вы писали:

D>Доброе время суток!

D>такая проблема...много поточное приложение! выполняется несколько потов-один управляющий-все остальные вспомагательные! управляющий имеет ссылки на объекты(Thread) всех вспомагательных объектов! каким образом из управляющего остановить выполнение заданного вспомагательного потока. Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать, а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!
D>заранее благодарен за ответ)
Вообще когда делаешь Abort потоку, то в потоке вознимает ThreadAbortException. Если его поймать и правильно обработать, то должно получиться.
Есть другой вариант (который рекомендуется в Java) вводится какой-либо флаг и по этому флагу в потоку крутиться цикл (ну если он там нужен). Чтобы остановить цикл, сбрасываем это флаг и поток завершится сам собой.
Re: Прекращение выполнения потока
От: Luchnik Россия  
Дата: 27.02.07 06:26
Оценка:
Здравствуйте, Dimetrius, Вы писали:

D>Доброе время суток!

D>такая проблема...много поточное приложение! выполняется несколько потов-один управляющий-все остальные вспомагательные! управляющий имеет ссылки на объекты(Thread) всех вспомагательных объектов! каким образом из управляющего остановить выполнение заданного вспомагательного потока. Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать, а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!
D>заранее благодарен за ответ)

Может помочь св-во Thread.IsBackground. Если у вспомогательных потоков это св-во будет выставлено в true, то они "автоматом" завершатся после завершения управляющего. Вопрос лишь в том — сгодится ли такая логика работы...
Re: Прекращение выполнения потока
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.02.07 07:56
Оценка:
Здравствуйте, Dimetrius, Вы писали:

D>Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать,

Thread.Abort не сработает, если прерываемый поток находится внутри блока catch или finally, или внутри статического конструктора, или ожидает захвата блокировки на объекте, или сидит внутри нативной функции. Точнее, он не сработает, пока поток не выйдет из такого состояния. Еще поток может перехватить ThreadAbortException и вызывать метод ResetAbort.

D>а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!

А вот это уже странно. Может быть, он висин на методе Join, который вызван следом?
Re: Прекращение выполнения потока
От: TK Лес кывт.рф
Дата: 27.02.07 08:48
Оценка: 1 (1) +2
Здравствуйте, Dimetrius, Вы писали:

D>Пытаюсь делать Thread.Abort


Лучше этого никогда не делать — проблем будет намного меньше
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Прекращение выполнения потока
От: Lloyd Россия  
Дата: 27.02.07 13:13
Оценка:
Здравствуйте, Dimetrius, Вы писали:

D>Доброе время суток!

D>такая проблема...много поточное приложение! выполняется несколько потов-один управляющий-все остальные вспомагательные! управляющий имеет ссылки на объекты(Thread) всех вспомагательных объектов! каким образом из управляющего остановить выполнение заданного вспомагательного потока. Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать, а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!
D>заранее благодарен за ответ)

Обычно рекомендуют не пользоваться Thread.Abort(), а самому реализовать некий механизм оповещения потока о том, что ему необходимо завершиться. Самый простой способ это сделать — выставлять флажок, а в работающем Thread-е периодически проверять этот флажок и завершать работу в случае если он выставлен.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Прекращение выполнения потока
От: Pavel M. Россия  
Дата: 27.02.07 13:24
Оценка:
Здравствуйте, Dimetrius, Вы писали:

D>Доброе время суток!

D>такая проблема...много поточное приложение! выполняется несколько потов-один управляющий-все остальные вспомагательные! управляющий имеет ссылки на объекты(Thread) всех вспомагательных объектов! каким образом из управляющего остановить выполнение заданного вспомагательного потока. Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать, а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!
D>заранее благодарен за ответ)

рекомендую сделать поиск по сайту, это распространенный вопрос, который обсуждался уже
--------------------------
less think — do more
Re[2]: Прекращение выполнения потока
От: Аноним  
Дата: 28.02.07 10:02
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Dimetrius, Вы писали:


D>>Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать,

N>Thread.Abort не сработает, если прерываемый поток находится внутри блока catch или finally, или внутри статического конструктора, или ожидает захвата блокировки на объекте, или сидит внутри нативной функции. Точнее, он не сработает, пока поток не выйдет из такого состояния. Еще поток может перехватить ThreadAbortException и вызывать метод ResetAbort.

Во вспомагательных потоках выполняется метод из другой dll по средством рефлексии, так что варианты со флагом и AutoResetEvent как предлагали в обсуждении похожих тем на форуме, к сожалению, отпадают!

D>>а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!

N>А вот это уже странно. Может быть, он висин на методе Join, который вызван следом?

Join я вообще нигде не вызываю!


И еще! может быть это важно все потоки и главный и рабочие создаются не явно, а в результате вызова Callback метода! сообщение приходит на порт и действие обрабатывающее это сообщение выполняется в отдельном потоке-например, может прийти сообщение-начать работу-и запуститься рабочий процесс, его объект Thread будет поставлен в список выполняющихся процессов; далее может прийти сообщение "остановить какой-то рабочий процесс" тогда из списка выбирается нужный объект Thread и я вызываю метод Thread.Abort()

код вызова прекращения потока такой:


  public void StopWork()
        {
            Console.WriteLine(_thread.ManagedThreadId.ToString() + " thread will be Aborted");
            _thread.Abort();//вот на этом вызове данный(завершающий поток и виснет), т.е. следующая строчка не выполняется даже после того как рабочий 
// поток, на который ссылается _thread сам завершается
            Console.WriteLine(_thread.ManagedThreadId.ToString() + " thread was Aborted");

        }
Re[3]: Прекращение выполнения потока
От: Dimetrius Украина  
Дата: 28.02.07 10:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, nikov, Вы писали:


N>>Здравствуйте, Dimetrius, Вы писали:


D>>>Пытаюсь делать Thread.Abort()-не помагает-вспомагательный поток продолжает работать,

N>>Thread.Abort не сработает, если прерываемый поток находится внутри блока catch или finally, или внутри статического конструктора, или ожидает захвата блокировки на объекте, или сидит внутри нативной функции. Точнее, он не сработает, пока поток не выйдет из такого состояния. Еще поток может перехватить ThreadAbortException и вызывать метод ResetAbort.

А>Во вспомагательных потоках выполняется метод из другой dll по средством рефлексии, так что варианты со флагом и AutoResetEvent как предлагали в обсуждении похожих тем на форуме, к сожалению, отпадают!


D>>>а управляющий виснет на вызове того же Thread.Abort()! вообщем не пинайте, если элементарный вопрос, я только начинаю разрабатывать многопоточные приложения!

N>>А вот это уже странно. Может быть, он висин на методе Join, который вызван следом?

А>Join я вообще нигде не вызываю!



А>И еще! может быть это важно все потоки и главный и рабочие создаются не явно, а в результате вызова Callback метода! сообщение приходит на порт и действие обрабатывающее это сообщение выполняется в отдельном потоке-например, может прийти сообщение-начать работу-и запуститься рабочий процесс, его объект Thread будет поставлен в список выполняющихся процессов; далее может прийти сообщение "остановить какой-то рабочий процесс" тогда из списка выбирается нужный объект Thread и я вызываю метод Thread.Abort()


А>код вызова прекращения потока такой:



А>
А>  public void StopWork()
А>        {
А>            Console.WriteLine(_thread.ManagedThreadId.ToString() + " thread will be Aborted");
А>            _thread.Abort();//вот на этом вызове данный(завершающий поток и виснет), т.е. следующая строчка не выполняется даже после того как рабочий 
А>// поток, на который ссылается _thread сам завершается
А>            Console.WriteLine(_thread.ManagedThreadId.ToString() + " thread was Aborted");

А>        }
А>


подписываюсь под сообщением)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.