Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 15
1

Почему поток не работает в режиме отладки

04.02.2012, 16:12. Показов 1765. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Мне нужно в приложении сделать анимацию кое-каких рассчетов и при этом нужна возможность останавливать процесс, масштабировать и т.п.

Вот код класса и код формы.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Windows;
using System.Threading;
 
namespace Modelling_1
{
    class Map
    {
        private ArrayList Edges;
        private Vertex[] Vertexes;
        private Agent[] Agents;
        private int[,] true_mat;
        private int vertex_count;
        private int edge_count;
        private Graphics g;
        private float scale_koef;
 
        //drawing or refreshing the map
        public void draw_map(System.Windows.Forms.PictureBox draw_box, int step)
        {
                //setting scale
                scale_koef = 1f;
 
                //creating bmp
                Bitmap bmp = new Bitmap((int)scale_koef * draw_box.Width, (int)scale_koef * draw_box.Height);
 
                //creating and setting graphics
                set_graphics(bmp);
 
                for (int i = 0; i < Vertexes.Count(); i++)
                {
                    Vertexes[i].draw(g, 480);
                }
 
                for (int i = 0; i < Edges.Capacity; i++)
                {
                    ((Edge)Edges[i]).draw(g, 480);
                }
                int MAX = draw_box.Height;
 
                double angle = a_gam(Vertexes[0].get_pos().X, Vertexes[0].get_pos().Y, Vertexes[1].get_pos().X, Vertexes[1].get_pos().Y);
                Matrix m1 = new Matrix(angle, Vertexes[0].get_pos().X, Vertexes[0].get_pos().Y);
                Vector v1 = new Vector(step, 0, 1);
                double[] a1 = v1.multiply_on_matr(m1);
                g.FillEllipse(Brushes.Red, (int)a1[0] - 2, MAX - (int)a1[1] - 2, 4, 4);
                //Thread.Sleep(50);
                
                draw_box.Image = bmp;
        }
 
        //calculation of angle between total and agent's coord system
        public double a_gam(int x, int y, int xc, int yc)
        {
            double angle;
            angle = Math.Acos((xc - x) / Math.Sqrt(Math.Pow(xc - x, 2) + Math.Pow(yc - y, 2)));
            if (x <= xc & y <= yc)
            {
                return angle;
            }
            if (x > xc & y < yc)
            {
                return angle;
            }
            if (x > xc & y > yc)
            {
                return 2 * Math.PI - angle;
            }
            else if (x < xc & y > yc)
            {
                return 2 * Math.PI - angle;
            }
            else return 0;
        }
 
        //graphics configuration
        public void set_graphics(Bitmap bmp)
        {
            g = Graphics.FromImage(bmp);
            g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.ScaleTransform(scale_koef, scale_koef);
 
        }
 
        //loading vertexes params from file and creating them
        public void load_vertex(string filename)
        {
            StreamReader st = new StreamReader(filename);
            vertex_count = Convert.ToInt32(st.ReadLine());
            Vertexes = new Vertex[vertex_count];
            for (int i = 0; i < vertex_count; i++)
            {
                string s = st.ReadLine();
                string[] s2 = s.Split(',');
                Vertexes[i] = new Vertex(i, 20, 1,Convert.ToInt32(s2[0]),Convert.ToInt32(s2[1]));
            }
        }
 
        //loading edges from true matrix and creating them
        public void load_edges(string filename)
        {
            StreamReader st = new StreamReader(filename);
            int edge_count = Convert.ToInt32(st.ReadLine());
            Edges = new ArrayList(edge_count);
            true_mat = new int[vertex_count,vertex_count];
 
            for (int i = 0; i < vertex_count; i++)
            {
                string s = st.ReadLine();
                string[] s2 = s.Split(' ');
                for (int j = 0; j < vertex_count; j++)
                {
                    true_mat[i, j] = Convert.ToInt32(s2[j]);
                }
            }
 
            for (int i = 0; i < vertex_count; i++)
            {
                for (int j = 0; j < vertex_count; j++)
                {
                    if (true_mat[i, j] != 0)
                    { 
                        Edges.Add(new Edge(Vertexes[i],Vertexes[j],1,40));
                    }
                }
            }
        }
    }
}

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
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace Modelling_1
{
    public partial class Form1 : Form
    {
        Map city = new Map();
 
        public Form1()
        {
            InitializeComponent();
            city.load_vertex("points.txt");
            city.load_edges("input.txt");
          
        }
 
        private void Thread_1()
        {
            for (int i = 1; i < 100; i++)
            {
                city.draw_map(pictureBox1, i);
                this.pictureBox1.Refresh();
            }
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            Thread backgroundThread = new Thread(new ThreadStart(Thread_1));
            backgroundThread.Start();
        }
    }
}

У меня при запуске приложения и клике вылазит исключение "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан."

Удивительно, но мой друг скомпилировал, запустил и у него все работает. Кто знает в чем проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2012, 16:12
Ответы с готовыми решениями:

Почему не работает виртуальный компорт в режиме отладки, а в нормальном режиме работет
Процессор stm32f205. Подключаю плату (собственной разработки) к компу, определяется виртуальный...

Почему-то в конфигураторе пропадает запуск в режиме отладки?
Почему - то вдруг перестал запускаться отладка в конфигураторе, есть только кнопка в панели...

Макрос работает в режиме отладки
Добрый день! Есть макрос, который работает в режиме отладки, а в автоматическом режиме...

Программа не работает в режиме отладки
Мне нужна помощь У меня есть много предупреждений и из-за них я не могу Debug. может кто-нибудь...

6
42 / 36 / 2
Регистрация: 18.12.2011
Сообщений: 113
04.02.2012, 17:06 2
У друга работает т.к. он очевидно запускал экзешник без дебага, а вы из-под студии

В потоках, что ~миллиард раз говорилось, к контролам обращаться через дистпечер|инвок/бегинИнвок формы/контрола и т.п.
0
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 15
04.02.2012, 19:46  [ТС] 3
iTheSaboteur, друг пересобирал и запускал и при этом все работало. Странно как-то. Можно плз пример насчет Invoke?
0
42 / 36 / 2
Регистрация: 18.12.2011
Сообщений: 113
04.02.2012, 21:31 4
C#
1
2
3
4
this.BeginInvoke((Action)delegate
{
/*statement block*/
});
Инуок по аналогии.
0
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 15
05.02.2012, 00:14  [ТС] 5
Спасибо,уже чтото Ошибки нет.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace Modelling_1
{
    public partial class Form1 : Form
    {
        Map city = new Map();
 
        public Form1()
        {
            InitializeComponent();
            city.load_vertex("points.txt");
            city.load_edges("input.txt");
        }
 
 
        // Worker Method
        void DoWork()
        {
            for (int i = 1; i < 100; i++)
            {
                city.draw_map(pictureBox1, i);
                this.pictureBox1.Refresh();
            }
        }
 
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            // Run the Background Worker
            this.BeginInvoke( (Action) delegate
        {
            DoWork();
        });
        }
    }
}
Во время выполнения форма все равно зависает. Никакого отдельного потока (((
Что не так?

Добавлено через 27 минут
УРААААА!!!
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace Modelling_1
{
    public partial class Form1 : Form
    {
        Map city = new Map();
        Thread backgroundThread;
 
        public Form1()
        {
            InitializeComponent();
            city.load_vertex("points.txt");
            city.load_edges("input.txt");
 
        }
 
        private void Thread_1()
        {
            for (int i = 1; i < 100; i++)
            {
                this.BeginInvoke(new Action(()=>
                {
                    city.draw_map(pictureBox1, i);
                    pictureBox1.Refresh();
                }));
                    
                    Thread.Sleep(50);
            }
           
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            backgroundThread = new Thread(Thread_1);
            backgroundThread.IsBackground = true;
            backgroundThread.Start();
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            backgroundThread.Abort();
        }
    }
}
По крайней мере пока запускается в отдельном потоке и интерфейс доступен. Скажите, я все правильно делаю?
0
42 / 36 / 2
Регистрация: 18.12.2011
Сообщений: 113
05.02.2012, 00:24 6
Зачем дуВорк весь в делегат-то было пихать?))
Вам только обращения к контролам надо выполнить в потоке создавшем этот контрол.

upd:
Да. Есть конечно пара странностей, но это мелочи.
0
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 15
05.02.2012, 00:37  [ТС] 7
Уже исправил))

Добавлено через 11 минут
iTheSaboteur, что за странности? В личку если можно
0
05.02.2012, 00:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2012, 00:37
Помогаю со студенческими работами здесь

Код работает только в режиме отладки
Вот этот злощастный код. А вот в чем его странность: когда я его обрабатываю построчно (F8),...

Функция работает только в режиме отладки.
народ , подскажите кто знает, у меня есть библиотека XLL без исходников с множеством длинных...

Программа работает только в режиме отладки
Программа работает только в режиме отладки, при обычном запуске в процессе работы зависает(я...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru