Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
8 / 8 / 10
Регистрация: 16.10.2012
Сообщений: 523

Не работает поток после повторного запуска

05.12.2015, 16:01. Показов 716. Ответов 0

Студворк — интернет-сервис помощи студентам
Добрый день. Имеется программа, которая определяет простоту больших чисел (30 знаков и более). Чтобы программа не зависала, я вношу процедуру расчета простого числа в отдельный фоновый поток backgroundWorker. Однако есть проблема, с первого раза все работает супер, кнопка блокируется, таймер идет, данные добавляются в listBox, а вот после повторного нажатия на кнопку Проверить! или нажатие на нее же после кнопки Стоп! Программа Отказывается корректно работать. Если я нажимаю повторного кнопку Проверить! после завершение процедуры, то у меня таймер время не показывает, данные не добавляются и кнопка не блокируется. Когда я жму Стоп!, а потом сразу Проверить! пишет, что не возможно запустить поток, т.к. он занят.
В чем проблема, кто может подсказать пути решения?
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics; //Для больших чисел
using System.Threading; //Для потоков
using System.Timers;
 
namespace EasyNumbers
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }
 
        //Переменные для работы цикла
        public BigInteger Start = 0, Finish = 0, Buffer = 0;
        public bool ResultToWork = false;
        public long Timer = 0;
 
        //Открыть файл и считать из него число в текстовом представлении
        private void buttonOpenFile_Click(object sender, EventArgs e)
        {
 
        }
        
        //Процедура превращающая число из обычного представления в текстовое и пишущее его в файл
        public void StringNumbers(int number)
        {
 
        }
 
        //Проверить массив чисел на простоту и записать в файл в текстовом варианте
        private void buttonPage2Go_Click(object sender, EventArgs e)
        {
            if (richTextBoxStart.Text.Equals("") || richTextBoxFinish.Text.Equals(""))
            {
                MessageBox.Show("Вы не ввели данные для работы цикла!");
            }
            else
            {
                Start = BigInteger.Parse(richTextBoxStart.Text);
                Finish = BigInteger.Parse(richTextBoxFinish.Text);
 
                if (Start < 0)
                {
                    MessageBox.Show("Нельзя начинать цикл с отрицательного числа!");
                    richTextBoxStart.Text = "0";
                }
                else
                {
                    listBoxResult.Items.Clear();                    
                    //Блокирование кнопки во время работы потока
                    buttonPage2Go.Enabled = false;
                    //Запуск таймера для работы потока
                    timer1.Enabled = true;                   
                    //Запуск таймера для времени
                    timer2.Enabled = true;
                    //Запуск фонового потока
                    backgroundWorker1.RunWorkerAsync();
                }
            }            
        }
 
        //Проверка на простоту числа
        public bool EasyNumbers()
        {
            MayBePrime mbp = new MayBePrime();
            try
            {
                for (BigInteger i = Start; i < Finish; i++)
                {
                    if (mbp.isMayBePrime(i) == true)
                    {
                        Buffer = i;
                        Thread.Sleep(100);
                    }
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
                return false;
            }
 
            ResultToWork = true;
            return true;
        }
 
        //Происходит при нажатии кнопки
        private void richTextBoxStart_KeyPress(object sender, KeyPressEventArgs e)
        {
            RichTextBox b = sender as RichTextBox;
            if (!(Char.IsDigit(e.KeyChar)) && (b.Text.Length != 0))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }
 
        //Происходит при нажатии кнопки
        private void richTextBoxFinish_KeyPress(object sender, KeyPressEventArgs e)
        {
            RichTextBox b = sender as RichTextBox;
            if (!(Char.IsDigit(e.KeyChar)) && (b.Text.Length != 0))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }
 
        //Таймер, показывающий сколько времени прошло
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Buffer != 0 && ResultToWork == false)
            {
                listBoxResult.Items.Add(Buffer);                
            }
            if (ResultToWork == true)
            {
                timer1.Enabled = false;
                timer2.Enabled = false;
                buttonPage2Go.Enabled = true;
            }
        }
 
        //Происходит по окончанию работы потока
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Завершено!");
        }
 
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (backgroundWorker1.CancellationPending == true)
            {
                return;
            }
            else
            {
                e.Result = EasyNumbers();
            }
        }
 
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {}
 
        DateTime date1 = new DateTime(0, 0);
        private void timer2_Tick(object sender, EventArgs e)
        {
            date1 = date1.AddSeconds(1);
            labelTimer.Text = "Время: " + date1.ToString("mm:ss");
        }
 
        private void buttonStop_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
            timer1.Enabled = false;
            timer2.Enabled = false;
            buttonPage2Go.Enabled = true;
 
            this.Refresh();
        }
    }
 
    public class MayBePrime
    {
        bool[] charr = null;
        int prime = 30030;//30030 для быстрого старта, ниже точность. Произведение первых простых чисел
        public bool isMayBePrime(BigInteger x)
        {
            if (charr == null)
            {
                charr = new bool[prime];
                for (int i = 0; i < prime; i++)
                {
                    if (NOD(prime, i) == 1)
                    {
                        charr[i] = true;
                    }
                    else
                    {
                        charr[i] = false;
                    }
                }
            }
            BigInteger n = x % prime;
            int n2 = 0;
            n2 = (int)n;
            if (charr[n2])
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public int NOD(int a, int b)
        {
            if (a == 0) return b;
            if (b == 0) return a;
            if (a == b) return a;
            if (a == 1 || b == 1) return 1;
            if ((a % 2 == 0) && (b % 2 == 0)) return 2 * NOD(a / 2, b / 2);
            if ((a % 2 == 0) && (b % 2 != 0)) return NOD(a / 2, b);
            if ((a % 2 != 0) && (b % 2 == 0)) return NOD(a, b / 2);
            return NOD(b, Math.Abs(a - b));
        }
    }
}
Миниатюры
Не работает поток после повторного запуска   Не работает поток после повторного запуска  
Вложения
Тип файла: rar EasyNumbers.rar (134.1 Кб, 1 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2015, 16:01
Ответы с готовыми решениями:

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

Ошибка после повторного запуска потока
Привет всем, решил попробовать себя в потоках но как-то не получилось. Проблема заключается в том что при первом нажатии на кнопку все...

Компьютер выключился, после повторного запуска выключается. Заранее спасибо!
конфиг. core i7 5820k msi x99s gaming 7 ddr4 16gb corsair vengance Enermax Liqtech 240 - охлаждение ssd hyperx 120gb+WD blue 1tb ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2015, 16:01
Помогаю со студенческими работами здесь

После закрытия приложения и его повторного запуска, добавленные данные исчезают из БД
Доброго времени суток, уважаемые! Проблема следующего характера: есть приложение, мной написанное, работающее с БД access (mdb). Данные...

Выпадающий список в ComboBox появляется только после повторного запуска формы
Нажимаем кнопку &quot;Начало работы&quot;, появляется форма, но в ComboBox выпадающий список не появляется, выключаем форму, после повторного нажатия...

Исключение повторного запуска
Допустим запущена некая программа, пользователь пытается запустить вторую копию. Как сделать чтобы программа определила что ее копия уже...

Компьютер выключается через 2 секунды после запуска, после чего не работает кнопка
Всем привет! Уже месяц меня беспокоит проблема. ПК включается через раз, то есть через 2 секунды после запуска, он офается, после чего...

О запрете повторного запуска приложения
Здравствуйте ! Решил &quot;украсить&quot; свой утиль запретом повторного запуска. Вопрос 1) Если я создаю мютекс, а пользователь закроет...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru