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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторный запуск потока, Запуск потока после остановки 
:(
    Опции темы
Stratus
Дата 29.5.2011, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Коллеги, подскажите как запустить поток после его остановки, 
или запустить его повторно...

В следующем коде необходимо после остановки потока запустить его заново...
Код

using System;
using System.Threading;

namespace StoppedThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Working Th = new Working();
            //щелкаем первый раз и останавливаем поток
            Console.ReadLine();
            Th.Stop();
            //щелкаем второй раз и запускаем поток
            Console.ReadLine();
            Th.Run();
            //щелкаем трейтий раз и пытаемся остановить поток
            Console.ReadLine();
            Th.Stop();

            Console.ReadLine();
        }
    }

    class Working
    {
        bool IsRun = true;
        Thread T;

        internal Working()
        {
            T = new Thread(ThreadWork);
            T.Start();
        }

        internal void Run()
        {
            IsRun = true;
            ThreadWork();
        }

        internal void Stop()
        {
            IsRun = false;
        }

        void ThreadWork()
        {
            while (IsRun)
            {
                Console.Write("*");
                Thread.Sleep(100);
            }
        }
    }
}


PM MAIL   Вверх
vlsaf
Дата 30.5.2011, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



После остановки потока, его повторно уже не запустить.
Делай эмуляцию остановки. Поток должен перейти как бы в режим ожидания.
Пусть анализирует некий флаг. Если он ложь, то ждем, если истина выполняемся.
А вот когда программа закончивает свою работу, тогда и делай стоп птоку.
PM   Вверх
Stratus
Дата 30.5.2011, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так вот я как раз  и не знаю как перевести его в режим ожидания....
PM MAIL   Вверх
vlsaf
Дата 30.5.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



самый понятный способ ( но не самый правильный) это зациклить 

while(!flag)
{
   thread.Sleep(20);
}

В этом случае если флаг ложь, то крутимся внутри цикла. Истина - выходим из него
переменная flag внешня и управляется твоими кнопками.

Как это осмыслишь., можно пойти дальше и впустую не нагружать процессор в цикле, а просто ожидать.
Как это сделать - вопрос второй. Тебе же пока для начала нужно сделать ожидание, хотя бы таким тупым способом.




Это сообщение отредактировал(а) vlsaf - 30.5.2011, 10:23
PM   Вверх
Stratus
Дата 30.5.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К сожалению вариант со Sleep не подойдет, для меня 20мс это уже критично.

Нужен более продвинутый способ.

Думаю вариант со Sleep в данном примере работать не будет или будет некорректно. Как только программа войдет в цикл в главном потоке она сразу "завесит" программу и внешним флагом её уже не остановишь или надо будет успеть нажать кнопку в перерыве между 20 мсек. 

Это сообщение отредактировал(а) Stratus - 30.5.2011, 12:22
PM MAIL   Вверх
Stratus
Дата 30.5.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Думаю что нужно думать в направлении перевода потока в режим ожидания и последующего его пробуждения,
или убивания потока и создание нового потока при повторном старте.

Какие будут идеи на этот счет?
PM MAIL   Вверх
Alca
Дата 30.5.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Думаю что нужно думать в направлении перевода потока в режим ожидания и последующего его пробуждения,

Используй ивенты и Wait-функции

Это сообщение отредактировал(а) Alca - 30.5.2011, 18:38


--------------------
PM WWW ICQ Skype Jabber   Вверх
Stratus
Дата 30.5.2011, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Alca @  30.5.2011,  18:37 Найти цитируемый пост)
Используй ивенты и Wait-функции

 smile 
PM MAIL   Вверх
Alca
Дата 30.5.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Могу на плюсах, т.к. шарп не курю.


--------------------
PM WWW ICQ Skype Jabber   Вверх
jonie
Дата 30.5.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

void ThreadProc(object oParam)
{
 var mre = (ManualResetEvent)oParam;
 //wait
 mre.WaitOne();
 ...
}

//где-то в приложении
...
ManualResetEvent stopEvent = new ManualResetEvent(false);
new Thread(ThreadProc).Start(stopEvent); //start new thread
Console.ReadLine();
stopEvent.Set();
...


Цитата

Могу на плюсах, т.к. шарп не курю. 

да на плюсах тоже самое будет по сути своей...

Это сообщение отредактировал(а) jonie - 30.5.2011, 20:45


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


Опытный
**


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

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



Цитата(Stratus @ 30.5.2011,  12:20)
К сожалению вариант со Sleep не подойдет, для меня 20мс это уже критично.

Нужен более продвинутый способ.

Думаю вариант со Sleep в данном примере работать не будет или будет некорректно. Как только программа войдет в цикл в главном потоке она сразу "завесит" программу и внешним флагом её уже не остановишь или надо будет успеть нажать кнопку в перерыве между 20 мсек.

Ну кто же тебе сказал, что sleep должен идти в главном потоке? 
В главном потоке создаешь другой фоновый поток, который должен засыпать и просыпаться.
Запускаешь его из главного. И будет тебе счастье.
В главном потоке (UI поток программы) только меняешь переменную flag.
А фоновый поток уже будет смотреть на этот флаг.
Подвисоны теоретически не возможны.


Про WaitOne() хотел сказать позже smile

Это сообщение отредактировал(а) vlsaf - 31.5.2011, 15:20
PM   Вверх
Alca
Дата 31.5.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 31.5.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Используй ThreadPool.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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