Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010". При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п. Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010. |
Томский политехнический университет
Опубликован: 23.01.2013 | Доступ: свободный | Студентов: 1157 / 192 | Длительность: 12:09:00
Тема: Программирование
Специальности: Программист, Архитектор программного обеспечения
Теги:
Самостоятельная работа 10:
Отладка многопоточного приложения с использованием окна стеков
< Самостоятельная работа 9 || Самостоятельная работа 10 || Самостоятельная работа 11 >
Аннотация: В рамках данного практического занятия, будет рассмотрен пример отладки параллельного приложения, с использованием окна вызова стеков.
- Создадим новое консольное приложение - "ParallelStackApplication":
- Скопируем код в созданный проект:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; namespace ParallelStacksApplication { class XClass { public void MA(object param) { MB(param); } public void MB(object param) { MC(param); } object s1 = new object(); object s2 = new object(); public void MC(object param) { if (param == "1") { MD(); } if (param == "2") { ME(); } if (param == "3") { MF(); } } public void MD() { ME(); } public void ME() { while (true) Thread.SpinWait(int.MaxValue / 20); } public void MF() { ML(); } public void MG(object param) { MH(param); } public void MH(object param) { MI(param); } public void MI(object param) { if (param == "4") { MJ(); } else { MK(); } } public void MJ() { Monitor.Enter(s1); Thread.SpinWait(int.MaxValue / 20); Monitor.Enter(s2); } public void MK() { Monitor.Enter(s2); Thread.SpinWait(int.MaxValue / 10); Monitor.Enter(s1); } public void ML() { MM(); } public void MM() { while (true) { Thread.SpinWait(int.MaxValue / 3); Debugger.Break(); }; } } class Program { static XClass obj = null; static void Main(string[] args) { obj = new XClass(); Task.Factory.StartNew(obj.MA, "1"); Task.Factory.StartNew(obj.MA, "2"); Task.Factory.StartNew(obj.MA, "3"); Task.Factory.StartNew(obj.MG, "4"); Task.Factory.StartNew(obj.MG, "5"); Console.ReadLine(); } } }
- Запустите отладку программы с помощью кнопки "Start Debbuging" из меню Visual Studio "Debug" или с помощью клавиши "F5":
- Через несколько секунд курсор отладчика должен остановиться на методе Debbuger.Break():
- Запустите окно параллельных стеков (Parallel Stacks) из меню "Debug -> Windows" или с помощью сочетания клавиш "Ctrl+Shift+D,S":
- В результате должно отобразиться "дерево" потоков:
- Переключимся на метод класса XClass - MС(). Для этого кликните правой кнопкой мыши по данному методу и выберите из списка "Switch To Frame" и установите флажок напротив значения 6568:
- После чего Visual Studio перейдет на данный фрагмент кода:
- В примере программы используется метод Debbuger.Break(), который позволяет останавливать отладку в нужной точке. Для того, что бы отладка программы выполнялась по шагам, расставим точки останова (breakpoints) напротив нескольких методов:
- Запустим отладчик. В результате программа будет осуществлять отладку по шагам и соответствующие изменения (в зависимости от шага) - будут отображаться в окне вызова стеков:
- Для завершения процесса отладки используется пункт из меню "Debug" - "Stop Debugging" или сочетание клавиш "Shift+F5":
< Самостоятельная работа 9 || Самостоятельная работа 10 || Самостоятельная работа 11 >