Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> kill all threads of "new Thread(newThreadStart())", Как убить все созданные потоки ? 
:(
    Опции темы
klein
Дата 21.9.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Всем привет. 
С убийством единичных потоков проблем не возникало, а вот с таким кодом:
Код

myThread = new Thread(new ThreadStart(myFunktion));


возникают - после запуска хотябы один раз этой строчки процес висит в диспетчере и не убиваетьса.
Использую с myThread  Abort(), Suspend(), Interrupt(), а толку 0. 
Благодарю за внимание.
PM MAIL   Вверх
6atoh
Дата 21.9.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 15.9.2006
Где: Minsk

Репутация: 2
Всего: 4



Цитата(klein @  21.9.2010,  09:20 Найти цитируемый пост)
Всем привет. 
С убийством единичных потоков проблем не возникало, а вот с таким кодом:
код C#
1:
myThread = new Thread(new ThreadStart(myFunktion));


возникают - после запуска хотябы один раз этой строчки процес висит в диспетчере и не убиваетьса.
Использую с myThread  Abort(), Suspend(), Interrupt(), а толку 0. 
Благодарю за внимание. 

Не совсем понимаю, что вы имеете ввиду под "убийством единичных потоков". В приведенном коде вы всего лишь создаете поток, даже не запускаете его.
Я вам советую не использовать принудительное завершение потока. Лучше организуйте нормальное завершение функции потока через установку флага.
Код

private void myFunktion()
{
    while(!abort)
    {
        //do thread work
    }
}

PM MAIL ICQ   Вверх
klein
Дата 21.9.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



6atoh 
Разумеетса что поток я стартую (.Start();), просто подумал что это и так понятно. 
Впринципе что убивать процес изнутри я понял, а как нет  smile .

Код

bool StopThreadFlug = false;
void  myFunktion()
{
       //использую иф потому что тело функции нужно вызывать только раз, но и с вайлом таже ситуация получилась
       if (StopThreadFlug ==false) 
       {
          // Telo funkcii
        }
}
void KillThread()
{
     StopThreadFlug = true;
     Dispose();
}
void main()
{
     my Thread = new Thread(new ThreadStart(myFunktion));
     Thread.Start();
     KillThread();
}

 Т.к. пишу в визуалке, то функция мейн чисто формальная. 
Тело функции нужно вызывать только раз, потому при запуске флаг стоит на розрешение, а при его сбросе процес уже запущен и никакого эфекта. Или есть какаято функция которую нужно прописать внутри myFunktion которая убивает процес в котором запущена даная же (myFunktion) функция ?

Добавлено через 7 минут и 2 секунды
При использовании 
Код

myThread.Abort();

после выхода из приложения процес висит в диспечере и его приходитьса убивать с диспечера в ручную.
PM MAIL   Вверх
6atoh
Дата 21.9.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 15.9.2006
Где: Minsk

Репутация: 2
Всего: 4



На текущий поток можно сослаться через статическое св-во CurrentThread класса Thread:
Код

var currentThread = Thread.CurrentThread;
currentThread.Abort();

Цитата(klein @  21.9.2010,  11:18 Найти цитируемый пост)
после выхода из приложения процес висит в диспечере и его приходитьса убивать с диспечера в ручную. 

Ты уверен, что проблема именно в том потоке, который ты прерываешь? Может быть есть еще какие-то потоки, которые упущены из виду?
PM MAIL ICQ   Вверх
klein
Дата 21.9.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



1. CurrentThread полезная фича, спасибо за наводку , (ато я уже мудрил как бы в функцию передавать указатель на поток который запускает этуже функцию).
2. Да, такое бывает только после хотябы однократного запуску(Старта) 
Код

myThread = new Thread(new ThreadStart(myFunktion));
myThread.Start();

а так прога нормально выгружаетса из процесов.

Добавлено через 2 минуты и 49 секунд
А таких запусков я планирую делать неопределенное количество (по событию нужен новый поток).
PM MAIL   Вверх
klein
Дата 21.9.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Методом научного тыка нащупал вот что, если делать так - 
Код

myThread.IsBackground = true;
myThread.Abort();
Dispose();

то все нормально  smile  . Блин, почти весь день угробил  smile  . Зато теперь буду знать что на небекграундные процесы аборт не распространяетса.
PM MAIL   Вверх
6atoh
Дата 21.9.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 15.9.2006
Где: Minsk

Репутация: 2
Всего: 4



Цитата(klein @  21.9.2010,  15:04 Найти цитируемый пост)
Методом научного тыка нащупал вот что, если делать так - 
код C#
1:
2:
3:
myThread.IsBackground = true;
myThread.Abort();
Dispose();

то все нормально    . Блин, почти весь день угробил    . Зато теперь буду знать что на небекграундные процесы аборт не распространяетса. 

По-моему, Abort-у нет разницы, основной это поток, или фоновый. Прерывает он как те, так и другие. Конечно, если ты вызываешь Abort внутри основного потока, который ко всему прочему еще и единственный "оставшийся в живых" поток в приложении, то этот вызов может и не дать никакого эффекта.
PM MAIL ICQ   Вверх
klein
Дата 22.9.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 30.5.2006
Где: Київ

Репутация: нет
Всего: нет



Вот вычитал здесь http://rsdn.ru/article/dotnet/CSThreading1.xml,  может кто как и я на эти грабли наступит.

Основные и фоновые потоки

По умолчанию потоки создаются как основные, что означает, что приложение не будет завершено, пока один из таких потоков будет исполняться. C# также поддерживает фоновые потоки, они не продлевают жизнь приложению, а завершаются сразу же, как только все основные потоки будут завершены.

ПРИМЕЧАНИЕ
Изменение статуса потока с основного на фоновый не изменяет его приоритет или статус в планировщике потоков.
Статус потока переключается с основного на фоновый при помощи свойства IsBackground, как показано в следующем примере:

Код

class PriorityTest 
{
  static void Main(string[] args) 
  {
    Thread worker = new Thread(delegate() { Console.ReadLine(); });

    if (args.Length > 0)
      worker.IsBackground = true;

    worker.Start();
  }
}


Добавлено через 14 минут и 23 секунды
 smile А тут прямо в точку !
Код

Превращение рабочего потока в фоновый может быть последним шансом завершить приложение, так как не умирающий основной поток не даст приложению завершиться. Зависший основной поток особенно коварен в приложениях Windows Forms, так как приложение завершается, когда завершается его главный поток (по крайней мере, для пользователя), но его процесс продолжает выполняться. В диспетчере задач оно исчезнет из списка приложений, хотя имя его исполняемого файла останется в списке исполняющихся процессов. Пока пользователь не найдет и не прибьет его, процесс продолжит потреблять ресурсы и, возможно, будет препятствовать запуску или нормальному функционированию вновь запущенного экземпляра приложения.

ПРЕДУПРЕЖДЕНИЕ
Обычная причина появления приложений, которые не могут завершиться должным образом – это такие “забытые” основные потоки.


Это сообщение отредактировал(а) klein - 22.9.2010, 10:18
PM MAIL   Вверх
userdab
Дата 22.9.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 3.9.2010

Репутация: нет
Всего: нет



Посмотрите как здесь убивается поток
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.