![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
По нажатию клавиши нужно поставить на паузу несколько потоков .Делал паузу сначала с помощью Suspend();Но это больно по косому.
знаю ,что мне в этом деле должен помочь ManualResetEvent либо AutoResetEvent с .WaitOne() , .Reset() , .Set() до конца так и не понял как это реализовать по нажатию клавиши ,сделал с AutoResetEvent , в классе где собственно находилось тело потоков ,ставил булевые функции в нужных точках,а с формы менял значение булевой функции ,тем самым вызывая WaitOne ,на 1 потоке более менее нормально вышло,а вот когда несколько сделал ,начались косяки.Подскажите как лучше сделать |
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
не ,ну с Suspend() и Resume() они то да работали,а вот с WaitOne() он у меня нормально работал ток под 1 поток,остальные 4 потока заторможенно передавали сообщение на текст бокс что потоки остановлены
|
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 12.3.2008 Репутация: нет Всего: нет |
дай код
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
Whitebrain, ну например так:
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
просто,почему мне не оч нравится Suspend ,у меня идет таймер ,в одном фрагменте и если я ставлю на паузу и какраз в том месте где таймер включился ,то по истечению времени,выдается сообщение
|
|||
|
||||
| VirusUZ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 9.4.2010 Где: Узбекистан, Навои й обл. Репутация: -1 Всего: -2 |
Thread.Threading.Sleep(100000);
....... thread1.stop(); --------------------
Virus |
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 12.3.2008 Репутация: нет Всего: нет |
удивительно, но таймер продолжает работать даже после Suspend но Сonsole.WriteLine("> Thread END!"); отрабатывает только после Resume.. |
|||
|
||||
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
просто единственный способ ,чтобы избежать косяка,надо делать булевые переменные,точнее ими нашпиговывать почти каждое действие потоков моих,чтобы можно было тормознуть их.
создать List с моими потоками,тк они находятся в соседнем классе (ну не в классе формы),и там менять значения булевых переменных? конечно наверно этот вариант через 5 ую точку ,но должен работать ManualResetEvent |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Whitebrain, почему ты говоришь во множественном числе? Тебе достаточно одного ManualResetEvent, чтоб тормузнуть все потоки...
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 12.3.2008 Репутация: нет Всего: нет |
Whitebrain почему через пятую? обычно останавливать потоки извне не очень корректно, как раз через булевые переменные все такое и делается. Вопрос лишь в том, насколько у тебя долго выполняются твои потоки, и насколько тебе важна скорость реакции на паузу потоков.
|
|||
|
||||
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
просто я когда так их тормозил,у меня 1 поток тормозится остальные вроде тоже,а выдает сообщение об остановки только 1,снимаю с паузы и только потом остальные потоки выдают месседж об остановке
|
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 12.3.2008 Репутация: нет Всего: нет |
давай код!
|
|||
|
||||
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
Вот ссыль на файл проекта Правда тут токо через Suspend написно,тк пока нормально не смог сделать с мануалом .
|
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 12.3.2008 Репутация: нет Всего: нет |
я щас домой с работы еду, нет времени вникать, но кажется все работает
|
|||
|
||||
| Whitebrain |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 13.4.2010 Репутация: нет Всего: нет |
ну саспенд то работает,но вот с таймером там косячит
|
|||
|
||||
| puZzo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 12.3.2008 Репутация: нет Всего: нет |
там у тебя конечно есть общие ресурсы(вилка) и суспенд не очень подойдет, но учитывая что у тебя там задержки весьма большие..вижу только один вариант, вместо Thread.Sleep(х) сделать
x - время задержки StopBool - булевая переменная, которой нужно присвоить true когда нужно приостановить поток, и false когда запустить снова ну что-то подобное, это избавит тебя от долгого отклика на паузу, и потоки будут тормозить корректно..времени нету щас возиться с этим. Ну ессно делай проверку StopBool в начале итерации бесконечного цикла, и если оно true, то цикл while пока снова не будет фальш. Это сообщение отредактировал(а) puZzo - 3.3.2011, 05:14 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |