Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427

Нужен пример с возможностью прерывания выполнения потоков

22.10.2012, 17:30. Показов 1192. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый вечер, форумчане. Собственно, столкнулся с необходимостью использования нескольких потоков. В качестве тестовой программы решил написать простенькую транспонацию 2х матриц 500*500 асинхронно. Вроде написал нормально, но при вызове в Форме все компоненты застывают (т.е. вроде все происходит в одном потоке).
Может, есть у кого простенький пример (желательно, с возможностью прерывания выполнения "потоков").
Вот что вышло у меня:
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
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 L3
{
    public partial class Form1 : Form
    {
        public const int MSIZE = 500;
        int[,] m1, m2;
        ThreadState th1, th2, th3;
 
        public delegate MTResult MatrixTrans(int mnm);
 
        private void MatrixTransCallback(IAsyncResult i)
        {
            MatrixTrans mt = (MatrixTrans)i.AsyncState;
            MTResult r = mt.EndInvoke(i);
            MessageBox.Show("Завершилось транспонирование матрицы №" + r.MNumber.ToString(), "End");
        }
 
        private MTResult trans(int mnm)
        {
            MTResult mtr = new MTResult();
            mtr.MNumber = mnm;
            mtr.i = mtr.j = 0;
            int mx = MSIZE * MSIZE;
            if (mnm == 1)
                this.Invoke((MethodInvoker)delegate { progressBar1.Maximum = mx; });
            if (mnm == 2)
                this.Invoke((MethodInvoker)delegate { progressBar2.Maximum = mx; });
            for (int i = 0; i < MSIZE; i++)
            {
                for (int j = 0; j < MSIZE; j++)
                {
                    int tmp;
                    mtr.i = i;
                    mtr.j = j;
                    if (mnm == 1)
                    {
                        tmp = m1[i, j];
                        m1[i, j] = m1[j, i];
                        m1[j, i] = tmp;
                        this.Invoke((MethodInvoker)delegate { progressBar1.PerformStep(); });
                    }
                    if (mnm == 2)
                    {
                        tmp = m2[i, j];
                        m2[i, j] = m2[j, i];
                        m2[j, i] = tmp;
                        this.Invoke((MethodInvoker)delegate { progressBar2.PerformStep(); });
                    }
                    if (th1.isStopped || th2.isStopped)
                        return mtr;
                }
            }
            return mtr;
        }
 
        public Form1()
        {
            InitializeComponent();
            m1 = new int[MSIZE, MSIZE];
            m2 = new int[MSIZE, MSIZE];
            for (int i = 0; i < MSIZE; i++)
            {
                for (int j = 0; j < MSIZE; j++)
                {
                    m1[i, j] = i * MSIZE + j;
                    m2[i, j] = j * MSIZE + i;
                }
            }
            
        }
        #region Кнопки
        #region Play/Pause
        private void button1pp_Click(object sender, EventArgs e)
        {
            th1.isActive = !th1.isActive;
            button1pp.Text = th1.isActive ? "Pause" : "Resume";
        }
 
        private void button2pp_Click(object sender, EventArgs e)
        {
            th2.isActive = !th2.isActive;
            button2pp.Text = th2.isActive ? "Pause" : "Resume";
        }
        #endregion
        #region Stop
        private void button1s_Click(object sender, EventArgs e)
        {
            groupBox1.Enabled = false;
            th1.isStopped = true;
        }
 
        private void button2s_Click(object sender, EventArgs e)
        {
            groupBox2.Enabled = false;
            th2.isStopped = true;
        }
        #endregion
        #endregion
 
        private void button1_Click(object sender, EventArgs e)
        {
            th1 = new ThreadState(); th2 = new ThreadState(); th3 = new ThreadState();
            MatrixTrans MT = trans;
            MT.BeginInvoke(1, MatrixTransCallback, MT);
            MT.BeginInvoke(2, MatrixTransCallback, MT);
        }
    }
}
public class MTResult
    {
        public int MNumber { get; set; }
        public int i { get; set; }
        public int j { get; set; }
    }
class ThreadState
    {
        private bool _active, _paused, _stopped;
        public bool isStopped { get { return _stopped; } set { _active = _paused = false; _stopped = value; } }
        public bool isPause { get { return _paused; } set { _paused = value; _active = !_paused; } }
        public bool isActive { get { return _active; } set { _active = value; _paused = !_paused; } }
        public ThreadState() { isStopped = false; isActive = true; isPause = false; }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2012, 17:30
Ответы с готовыми решениями:

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

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

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

2
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
22.10.2012, 17:33  [ТС]

Форма выглядит так.
0
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136
28.05.2015, 17:28
ошибся темой
Вложения
Тип файла: rar Lab7.rar (192.2 Кб, 4 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2015, 17:28
Помогаю со студенческими работами здесь

Отсчет времени с возможностью прерывания
VB 2010 Express Здрям! При нажатии кнопки min5 работает нормально, при min25 - наглухо зависает. Ставил на форме флажок, чтобы...

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

Чтение данных с SQL сервера с возможностью прерывания чтения, если оно длится более 30 секунд
есть DataTable, куда нужно считать данные, но нужно иметь возможность прерывания чтения, если оно длится более 30 секунд (по таймеру). ...

Создать разное количество потоков с возможностью ожидания события из одного потока в другом
Добрый день. Прошу подсказки в выборе высокоуровневых средств для работы с потоками. Мне нужно создавать разное количество потоков и...

Пример потоков в VBA
Доброго времени суток всем. Прошу помочь разобраться с одним вопросом. Не могу разобраться с потоками в VBA (В частости Access) Я...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru