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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преостановить работу потока, где использовать синхронизацию? 
V
    Опции темы
totoiiiuk
Дата 15.2.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть класс, который создает рисунок, получает ссылку на grid (WPF), добавляет его туда и потом заставляет двигаться в потоке, работающем через myGrid.Dispatcher.Invoke. Естесно потоков много и их управлением занимаются несколько Делегатов. Например: Старт, Стоп, Пауза, Возобновление. Вот тока при вызове Пауз или Стопов потоков, в какой-нибудь момент срабатывает не сразу, т.е. летящий по форме рисунок стопается не сразу при срабатывании Стопа или Паузы. Видимо это связано с тем, что ожидают от формы возможности двинуться. Вот теперь думаю надо научиться именно для Стопа и Паузы блокировать доступ потока к той части кода, которая двигает рисунок. Как это делать, т.к. сам я не разобрался с этой, блин, синхронизацией )? 
Код

public class ЛетающийОбъект
    {
        Thread поток;
        Image рисунок;
        Grid grid;
        public ЛетающийОбъект(/*всякие переменные*/ Grid myGrid)
        {
            /*Инициализация рисунка*/
            /*Инициализация переменных*/
            grid = myGrid;
            myGrid.Children.Add(рисунок);
            поток= new Thread(new ThreadStart(ПотокЛетящегоОбъекта));
        }
        public void Старт()
        {
            поток.Start();
        }
        public void Пауза()
        {
            поток.Resume();
        }
        public void Возобновление()
        {
            поток.Suspend();
        }
        public void Стоп()
        {
            поток.Abort();
        }
        private void ПотокЛетящегоОбъекта()
        {
            while (/*выполняется условие*/)
            {
                /*вычисляем координаты*/
                grid.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
                {
                    рисунок.Margin = new Thickness(X, Y, 0, 0);
                }));
                /*задержка, скорость*/
            }
        }
    }

PM MAIL   Вверх
jonie
Дата 15.2.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Вот теперь думаю надо научиться именно для Стопа и Паузы блокировать доступ потока к той части кода, которая двигает рисунок. Как это делать, т.к. сам я не разобрался с этой, блин, синхронизацией )? 
ну можно использовать, например ManualResetEvent
вот пример:
Код

        static void Example1()
        {
            ManualResetEvent stopEvent = new ManualResetEvent(false);

            Thread th = new Thread(Example1ThreadRoutine);
            th.Start(stopEvent);
            Console.WriteLine("---Started---");
            Console.ReadLine();
            stopEvent.Set();
            while ((th.ThreadState & ThreadState.Stopped) != ThreadState.Stopped)
            {
                Console.WriteLine("...wait for thread stop...");
                Thread.Sleep(200);
            }
            Console.WriteLine("---Terminated---");
            Console.ReadLine();
            stopEvent.Close();  //cleanUp
        }
        static void Example1ThreadRoutine(object p)
        {
            ManualResetEvent lstopEvent = (ManualResetEvent)p;
            while (!lstopEvent.WaitOne(0))
            {
                {
                    Console.WriteLine("Begin work");
                    Thread.Sleep(5000);
                    Console.WriteLine("End work");
                }
            }
            Console.WriteLine("Exit thread");
        }

а можно воспользоваться BackgroundWorker-ом
вот еще пример:
Код

        static void Example2()
        {
            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += Example2ThreadRoutine;
                bw.RunWorkerAsync(bw);

                Console.WriteLine("---Started---");
                Console.ReadLine();

                bw.CancelAsync();

                while (bw.IsBusy)
                {
                    Console.WriteLine("...wait for thread stop...");
                    Thread.Sleep(200);
                }
                Console.WriteLine("---Terminated---");
                Console.ReadLine();
            }
        }

        static void Example2ThreadRoutine(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)e.Argument;
            while (!bw.CancellationPending)
            {
                {
                    Console.WriteLine("Begin work");
                    Thread.Sleep(5000);
                    Console.WriteLine("End work");
                }
            }
            Console.WriteLine("Exit thread");
        }


а вообще мне код рисования в wpf не понравился 8-) может стоит делать двойную буферизацию или как там в wpf делают... там, кстати, было и про анимацию что-то своё....


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


Шустрый
*


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

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



Возможно. Но я когда писал преследовал две цели. Первое - курсовую сдать наконец на пять, а второе понять что это - потоки и как ими управлять.
А управляющих команд к ним будет многа-многа. Т.е. это не анимация, а пользовательское управление визуальными объектами - как бы так )).
А эти штуки попробую (ManualResetEvent и BackgroundWorker), хотя сам гуглил по lock и Monitor.
Спасибо, jonie.
PM MAIL   Вверх
nikitao
Дата 16.2.2009, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



totoiiiuk, простите , а вы в шутку или вправду кириллицу в коде юзаете ?

Кроме того это не есть гуд для каждого обьекта заводить свой поток в котором он просчитывает своии координаты. Разумнее завести 1 поток в котором будут высчитываться все координаты , а потом быстро перерисовываться графика.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
totoiiiuk
Дата 16.2.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile В правду. Привык как-то. Всегда свой код очень тщательно комментировал. Теперь зато коментов писать меньше. Понимаю, это на любителя. Я наверное и есть этот любитель.

Поток внутри объекта дает ему самостоятельность что ли. Можно сказать зверушка получается, которой моно сказать: "сиди", или там "крутись". Она может сама чем-то заняться. Весело же )))

Это сообщение отредактировал(а) totoiiiuk - 16.2.2009, 14:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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