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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Как сообщить потоку о остановке? 
:(
    Опции темы
jfx
  Дата 27.5.2005, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задача такая: Есть прогрес бар, есть поток который что-то делает и двигает прогресс бар. Есть кнопка Cancel при нажатии на которую нужно сказть потоку что бы он завершился. Перед завершением поток должен закрыть все открытые файлы, т.е. не просто прекратиться на том месте где он получил сообщение а перейти на процедуру корректного завершения.
PM MAIL   Вверх
arilou
Дата 27.5.2005, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



В принципе, просто:

Код

Thread thread = ..... // твой поток

// поточная ф-ция
private void threadProc()
{
  try
  {
    // твой поток работает
  }
  catch(ThreadAbortException)
  {
    // операции по корректной обработке заверешения потока
  }
}

// где-то в твоем коде
thread.Abort(); // в поточной ф-ции происходит ThreadAbortException



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
jfx
Дата 27.5.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо.
PM MAIL   Вверх
jfx
Дата 31.5.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще пара вопросов, если можно smile Все по потокам. Разобрался с Invoke, BeginInvoke и прочем...
Как мне сообщить основному потоку (UI) что второй поток закончил работу и вернуть какой-то результат. Насколько я понимаю нужно это делать с помощью событий. Как? В английском к сожалению силен не сильно. Вот тут вроде довольно прозрачный пример, но я не разобрался smile ms-help://MS.MSDNQTR.2003JUL.1033/dnmag03/html/Multithreading.htm
Разъясните пожалуйста.

Это сообщение отредактировал(а) jfx - 31.5.2005, 13:04
PM MAIL   Вверх
arilou
Дата 31.5.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



С помощью событий можно. Дожидаешься момента, когда поток подойдет к концу, и выбрасываешь событие.

На этом событии у тебя обработчик. Он будет выполнен в потоке, откуда событие запущено. Псведвокод:

Код

public class MyThreadAction
{
  public event EventHandler ActionFinished;
  private void myThreadFunc()
  {
    Console.WriteLine("Начали");
    // ... чего-то делаем
    if(ActionFinished != null)
      ActionFinished(this, new EventArgs());
  }

  private void doOnActionFinished(object sender, EventArgs e)
  {
    Console.WriteLine("Завершили");
  }

  public void Start()
  {
    ActionFinished += new EventHandler(doOnActionFinished);
    // запускаем поток
    // ...
  }
}


Естественно, doOnActionFinished может находиться и в другом классе.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
jfx
Дата 31.5.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо. А как быть если основной поток и дополнительный в разных классах?

Пример:

Код

// Основной поток
class UI
{
      void Begin()
      {
            ThreadStart ts = new ThreadStart(StartWork);
            th = new Thread(ts);
            th.Start();
      }

      void StartWork()
      {
            Work wrk = new Work();
            wrk.Start();
      }

      void FinishMsg()
      {
            MessageBox.Show("Finish");
      }
}

// Второй поток
class Work
{
      public event EventHandler ActionFinished;

      public void Start()
      {
            // работаем
            if(ActionFinished != null)
            ActionFinished(this, new EventArgs());
      }
}


Это сообщение отредактировал(а) jfx - 1.6.2005, 17:14
PM MAIL   Вверх
jfx
Дата 1.6.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



...вечер был и я сильно тупил...
Разобрался короче smile Еще раз спасибо.
PM MAIL   Вверх
arilou
Дата 1.6.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Не за что. Сорри, мне почему-то не пришло уведомление о твоем ответе, поэтому я ничего не сказал.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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