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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пауза нескольких потоков, Нажатие на клавишу-приостановка потоков 
:(
    Опции темы
Whitebrain
  Дата 26.2.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По нажатию клавиши нужно поставить на паузу несколько потоков .Делал паузу сначала  с помощью Suspend();Но это больно по косому.
знаю ,что мне в этом деле должен помочь ManualResetEvent либо AutoResetEvent
с .WaitOne() , .Reset() , .Set() до конца так и не понял как это реализовать по нажатию клавиши ,сделал с AutoResetEvent ,
в классе где собственно находилось тело потоков ,ставил булевые функции в нужных точках,а с формы менял значение булевой функции ,тем самым вызывая WaitOne ,на 1 потоке более менее нормально вышло,а вот когда несколько  сделал ,начались косяки.Подскажите как лучше сделать smile 
PM MAIL   Вверх
puZzo
Дата 26.2.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а что за косяки то?

Suspend и Resume
устарели конечно и мелкомягкотелые не рекомендуют их использовать, не потокобезопасно))

http://msdn.microsoft.com/ru-ru/library/sy...ad.suspend.aspx
http://msdn.microsoft.com/ru-ru/library/sy...ead.resume.aspx

Это сообщение отредактировал(а) puZzo - 26.2.2011, 22:14
PM ICQ   Вверх
Whitebrain
Дата 27.2.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не ,ну с Suspend() и Resume() они то да работали,а вот с WaitOne() он у меня  нормально работал ток под 1 поток,остальные 4 потока заторможенно передавали сообщение на текст бокс что потоки остановлены 
PM MAIL   Вверх
puZzo
Дата 27.2.2011, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



дай код
PM ICQ   Вверх
jonie
Дата 27.2.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Whitebrain, ну например так:
Код

    class Program
    {

        static ManualResetEvent waitHandle = new ManualResetEvent(false);

        static void Main(string[] args)
        {
            for (int i = 0; i < 5; ++i)
            {
                new Thread(o =>
                {
                    while (true)
                    {
                        waitHandle.WaitOne();
                        Console.WriteLine("Thread {0} work!", Thread.CurrentThread.ManagedThreadId);
                        Thread.Sleep(200);
                    }
                }).Start();
            }

            waitHandle.Set();   //start
            Console.WriteLine("Press enter to pause!");
            Console.ReadLine();
            waitHandle.Reset();   //stop

            Console.WriteLine(".....");
            Console.ReadLine();
            
        }
    }



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Whitebrain
Дата 28.2.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



просто,почему мне не оч нравится Suspend ,у меня идет таймер ,в одном фрагменте и если я ставлю на паузу и какраз в том месте где таймер включился ,то по истечению времени,выдается сообщение 
PM MAIL   Вверх
VirusUZ
  Дата 28.2.2011, 09:26 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 9.4.2010
Где: Узбекистан, Навои й обл.

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



Thread.Threading.Sleep(100000);

.......

thread1.stop();
--------------------
Virus
PM MAIL   Вверх
puZzo
Дата 28.2.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код
using System;
using System.Collections;
using System.Text;
using System.Threading;

namespace ThreadSuspend
{
    class Program
    {
        static ArrayList ThreadList = new ArrayList();

        static void Main(string[] args)
        {
            Thread TimerThread = new Thread(new ThreadStart(mt_Timer));
            TimerThread.Start();

            // создаем потоки
            for (int i = 0; i < 5; i++)
            {
                ThreadList.Add(new Thread(new ThreadStart(mt_ThreadProc)));
            }

            Console.WriteLine("| Объекты потоков созданы");

            Console.WriteLine("| Запуск потоков");
            // запускаем их
            foreach (Thread trd in ThreadList)
            {
                trd.Start();
            }

            // ждем три секунды
            Thread.Sleep(5000);

            // приостанавливаем их
            foreach (Thread trd in ThreadList)
            {
                trd.Suspend();
            }

            Console.WriteLine("| Потоки приостановлены");
            // ждем еще три секунды
            Thread.Sleep(15000);

            Console.WriteLine("| Запуск потоков");
            // запускаем потоки
            foreach (Thread trd in ThreadList)
            {
                trd.Resume();
            }
        }

        static private void mt_ThreadProc()
        {
            Console.WriteLine("> Thread BEGIN!");
            
            Thread.Sleep(30000);

            Console.WriteLine("> Thread END!");
        }

        static private void mt_Timer()
        {
            while (true)
            {
                Console.WriteLine("1 секунда");
                Thread.Sleep(1000);
            }
        }
    }
}


удивительно, но таймер продолжает работать даже после Suspend smile 
но  Сonsole.WriteLine("> Thread END!"); отрабатывает только после Resume..
PM ICQ   Вверх
Whitebrain
Дата 28.2.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



просто единственный способ ,чтобы избежать косяка,надо делать булевые переменные,точнее ими нашпиговывать почти каждое действие потоков моих,чтобы можно было тормознуть их.
 создать List с моими потоками,тк они находятся в соседнем классе (ну не в классе формы),и там менять значения булевых переменных?
конечно наверно этот вариант через 5 ую точку ,но должен работать  ManualResetEvent
PM MAIL   Вверх
-Mikle-
Дата 28.2.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Whitebrain, почему ты говоришь во множественном числе? Тебе достаточно одного ManualResetEvent, чтоб тормузнуть все потоки...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
puZzo
Дата 28.2.2011, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Whitebrain почему через пятую? обычно останавливать потоки извне не очень корректно, как раз через булевые переменные все такое и делается. Вопрос лишь в том, насколько у тебя долго выполняются твои потоки, и насколько тебе важна скорость реакции на паузу потоков. 
PM ICQ   Вверх
Whitebrain
Дата 28.2.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



просто я когда так их тормозил,у меня 1 поток тормозится остальные вроде тоже,а выдает сообщение об остановки только 1,снимаю с паузы и только потом остальные потоки выдают месседж об остановке
PM MAIL   Вверх
puZzo
Дата 28.2.2011, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



давай код!
PM ICQ   Вверх
Whitebrain
Дата 1.3.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот ссыль на файл проекта Правда тут токо через Suspend написно,тк пока нормально не смог сделать с мануалом . smile 
PM MAIL   Вверх
puZzo
Дата 1.3.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я щас домой с работы еду, нет времени вникать, но кажется все работает smile вечерком погляжу более детально;-)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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