Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/24: Рейтинг темы: голосов - 24, средняя оценка - 4.54
pizurok
76 / 68 / 19
Регистрация: 05.05.2013
Сообщений: 3,807
1

Приостановка/возобновление потока

11.09.2013, 17:48. Просмотров 4678. Ответов 6
Метки нет (Все метки)

Здравствуйте, гуру многопоточного программирования!

Помогите, пожалуйста, разобраться с приостановкой, возобновлением.
Суть такова, есть программа (WinForms), которая действует подобно службе с кнопками Start и Stop. Кнопки, как вы уже догадались, приостанавливают и запускают поток, который выполняет всякие хорошие действия. Раньше я пользовался методами Thread.Suspend() и Threat.Resume() однако майкрософт ругается на то, что эти методы морально устарели, несинхронизированы и вообще непонятно какой код будет выполняться после внезапного Suspend(). Посоветуйте, как вы решали подобные задачи, а то курение мануалов про примитивы синхронизации особо не помогло, желательно пример.
Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 17:48
Ответы с готовыми решениями:

Приостановка потока
требуется по нажатию кнопки поставить поток на паузу, при нажатии другой,...

Приостановка потока до выполнения какого либо события
Пишу клиент - серверное приложение где в методе для продолжение работы нужно...

Приостановка работы
Здравствуйте!Ситуация такова: В программе выполняется функция.Во время её...

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List<SomeClass> listSC, String fileName) { ...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не...

6
VladislavTepes
78 / 78 / 14
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
11.09.2013, 19:45 2
pizurok, используйте ManualResetEvent:
C#
1
2
3
4
5
6
7
8
Thread thr=new Thread(delegate() { while(true) Console.WriteLine("Hi");} );
ManualResetEvent me = new ManualResetEvent(true);
//Thread start
thr.Start(mn);
//Thread suspend
me.Reset();
//Thread resume
me.Reset();
0
Anklav
443 / 301 / 47
Регистрация: 23.01.2013
Сообщений: 641
Завершенные тесты: 2
11.09.2013, 20:14 3
VladislavTepes, что это за бред Вы в написали? У Вас этот код даже не запустится. Не говоря про то что он будет правильно работать.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
        private static void Main()
        {
            Thread thr = new Thread(Method);
            ManualResetEvent me = new ManualResetEvent(true);
 
            thr.Start(me);
            Thread.Sleep(2000);
 
            Console.WriteLine("Pause");
            me.Reset();
 
            Thread.Sleep(2000);
 
            Console.WriteLine("Run");
            me.Set();
 
            Thread.Sleep(300);
 
            me.Reset();
        }
 
        private static void Method(object state)
        {
            ManualResetEvent MRE = (ManualResetEvent)state;
 
            while (true)
            {
                MRE.WaitOne();
                Thread.Sleep(100);
                Console.WriteLine("Test");
            }
        }
1
VladislavTepes
78 / 78 / 14
Регистрация: 27.06.2012
Сообщений: 555
Записей в блоге: 1
11.09.2013, 20:26 4
Черт, действительно херь написал. Sorry.
0
Psilon
Master of Orion
Эксперт .NET
6012 / 4864 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
11.09.2013, 23:17 5
Anklav, вопрос: а что, если мы не можем внутри потока проверять стерт? То есть у нас есть какая-то длительная операция, и мы должны ее приостанавливать. Ну например очень долгая библиотечная функция, от которой нет исходников.
0
pizurok
76 / 68 / 19
Регистрация: 05.05.2013
Сообщений: 3,807
12.09.2013, 15:26  [ТС] 6
Цитата Сообщение от Anklav Посмотреть сообщение
VladislavTepes, что это за бред Вы в написали? У Вас этот код даже не запустится. Не говоря про то что он будет правильно работать.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
        private static void Main()
        {
            Thread thr = new Thread(Method);
            ManualResetEvent me = new ManualResetEvent(true);
 
            thr.Start(me);
            Thread.Sleep(2000);
 
            Console.WriteLine("Pause");
            me.Reset();
 
            Thread.Sleep(2000);
 
            Console.WriteLine("Run");
            me.Set();
 
            Thread.Sleep(300);
 
            me.Reset();
        }
 
        private static void Method(object state)
        {
            ManualResetEvent MRE = (ManualResetEvent)state;
 
            while (true)
            {
                MRE.WaitOne();
                Thread.Sleep(100);
                Console.WriteLine("Test");
            }
        }
Хорошо, а как же тогда завершить поток? То есть фактически в этой программе завершается главный поток, а тот все продолжает ждать и программа виснет.

Добавлено через 5 часов 32 минуты
Думаю надо сделать
C#
1
2
me.Close();
thr.Abort();
Тогда поток по идее должен освободить ресурсы и нормально завершиться, всем спасибо
0
Anklav
443 / 301 / 47
Регистрация: 23.01.2013
Сообщений: 641
Завершенные тесты: 2
12.09.2013, 20:45 7
Psilon, замены методам Suspend и Resume (без вмешательства в код потока) не знаю.
1
12.09.2013, 20:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 20:45

Отлов окна, и приостановка его
Ребят как сделать чтобы программа отлавливала программы по handle или еще как...

утечка потока
public class ClassThread { static public int counThread; ...

Остановка потока
Уважаемые программисты, прошу помощи, ибо не нашел логического объяснения своей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru