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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как остоновить поток в C# 
V
    Опции темы
Miller_time
Дата 20.7.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 8.9.2006
Где: Нижний Новгород

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



Подкажите как остановить поток, не могу не как до него "достучаться"


Код

Thread t; // Это сам поток вообщемто 

public void Methot1()
{
            t = new Thread(SendPar);
            t.Start();            // Запускаю его
}

 public void SendPar()
        {
            if ((bDoLoop == true) && (TV != null))
            {
                while (true)
                {
                     //Выполняем что-то.
                }
            }
            else
            {
                MessageBox.Show("bred");
            }
        }





Подскажите как его тормазнуть ? Даже после закрытия окно, он продолжает выполняться.

Добавлено через 1 минуту и 11 секунд
Даже если изменю парметры bDoLoop на false он продолжет выполнсяться. :( 


--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
mihryak
Дата 20.7.2009, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Miller_time @  20.7.2009,  01:16 Найти цитируемый пост)
Подскажите как его тормазнуть ? Даже после закрытия окно, он продолжает выполняться.

thread.IsBackground = true;
при выходе из приложения все потоки с тим выставленным свойством остановятся

Цитата(Miller_time @  20.7.2009,  01:16 Найти цитируемый пост)
Даже если изменю парметры bDoLoop на false он продолжет выполнсяться. :(  

ещё бы, это поле прверяется лишь однажды, потом идёт while(true)
если хочешь извне прервать этот поток - переодически проверяй это условие в цикле или напиши while(bDooLoop)
тоже, впрочем не лучшее решение, по-хорошему, нужно использовать средства синхронизации для проверки такого условного флага, но в банальных ситуациях, когда несколько лишних пробегов по циклу ничего дурного не сделают, можно обойтись и без

есть ещё метод thread.Abort(), но он довольно суров и, к тому же, тоже может не обеспечить моментального прекращения выполнения потока

а вообще, лучше для этих целей использовать какой-нибудь WaitHandle, например, AutoResetEvent и его методы Set, Reset (вызываемые извне) и WaitOne, вызываемый в цикле
PM MAIL ICQ   Вверх
Miller_time
Дата 20.7.2009, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 8.9.2006
Где: Нижний Новгород

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



Нашел вариант решения, коректного завершения 


использованно с другова сайта 


Могу предложить еще вариант делаешь в классе потока :
Код

public bool StopThread = false;

логика потока:

while (!StopThear)
{
.............
}

//что бы завршить поток:

Thread1.StopThread = true;


тогда он завершит свои действия и сам умрет


--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
Skynin
  Дата 20.7.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не забывать volatile в таких случаях!
Код

public volatile bool StopThread = false;


Ключевое слово volatile указывает, что поле может быть изменено несколькими потоками, выполняющимися одновременно. Поля, объявленные как volatile, не проходят оптимизацию компилятором, которая предусматривает доступ посредством отдельного потока. Это гарантирует наличие наиболее актуального значения в поле в любое время.
volatile (Справочник по C#)

Это сообщение отредактировал(а) Skynin - 20.7.2009, 09:23
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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