Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Wolf6969
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 15
#1

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

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2012, 16:12
Ответы с готовыми решениями:

Работа с сокетами: клиент-сервер работает только из под отладки
Пытаюсь осилить сетевое программирование, отойдя чуть дальше простых примеров....

Почему не все ядра загружены и, как сделать так, чтобы отдельный поток подавался на отдельное ядро?
Создал 12 потоков, а как-то не все ядра загружены. Процессор i7-3930K. ...

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

Почему не работает Update, но работает аналогичный Delete?
В xmal есть datagrid в него подтянута из базы информация. Название и...

Не работает режим отладки
создал веб приложение. когда пытаюсь олаживать сразу выскакивает сообщение об...

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

В потоках, что ~миллиард раз говорилось, к контролам обращаться через дистпечер|инвок/бегинИнвок формы/контрола и т.п.
0
Wolf6969
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 15
04.02.2012, 19:46  [ТС] #3
iTheSaboteur, друг пересобирал и запускал и при этом все работало. Странно как-то. Можно плз пример насчет Invoke?
0
Reactionary
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
Wolf6969
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
Reactionary
42 / 36 / 2
Регистрация: 18.12.2011
Сообщений: 113
05.02.2012, 00:24 #6
Зачем дуВорк весь в делегат-то было пихать?))
Вам только обращения к контролам надо выполнить в потоке создавшем этот контрол.

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

Добавлено через 11 минут
iTheSaboteur, что за странности? В личку если можно
0
05.02.2012, 00:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2012, 00:37

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

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

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


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

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

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