Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2

Сигнал из потока при закрытии формы

23.02.2014, 17:17. Показов 1654. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня.
Вот пытаюсь решить проблему с сигналом из потока, вроде что-то придумалось, но хотелось бы посоветоваться...
Смысл моей задумки - работает программа, в отдельном потоке большой цикл. Если к моменту закрытия программы цикл не завершен, в деструкторе вызывается событие, на которое подписка в методе закрытия формы. И это событие передает мне данные из отдельного потока, то есть результат, до которого поток доработал, для дальнейшего сохранения.
У меня получилось пока только так, через деструктор. Верно ли это, или есть еще какие способы?
Вот мой тестовый код, только что написанный.
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
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 ThreadInteractionDemo
{
    public partial class Form1 : Form
    {
        MyThread mt;
 
        public Form1()
        {
            InitializeComponent();
            button1.Click+=new EventHandler(button1_Click);
            this.FormClosing+=new FormClosingEventHandler(Form1_FormClosing);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            mt = new MyThread("Thread_1", 1000);
            mt.thr.Start();
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (mt != null)
                mt.CloseThread += new Action<string>(mt_CloseThread);
            else
                return;
        }
        void mt_CloseThread(string str)
        {
            MessageBox.Show("Поток не завершен, результат работы потока: " + str);
        }
    }
    class MyThread
    {
        public event Action<string> CloseThread;
        public Thread thr;
        int x;
        int i;
 
        public MyThread(string name, int n)
        {
            thr = new Thread(new ThreadStart(this.run));
            thr.Name = name;
            thr.IsBackground = true;
            x = n;
            i = 0;
        }
        private void run()
        {
            for (i = 0; i < x; i++)
            {
                Thread.Sleep(100);
            }
        }
        ~MyThread()
        {
            if (i < x)
            {
                if (CloseThread != null)
                    CloseThread(i.ToString());
            }
            else
                return;
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2014, 17:17
Ответы с готовыми решениями:

Как выполнить код в закрытии формы при ее принудительном закрытии?
Привет всем) Суть вопроса такова: есть форма, и при её закрытии нужно выполнить код. Если закрывать форму на крестик или...

Завершить работу потока при закрытии формы
procedure TForm1.BStartClick(Sender: TObject); begin ProgressBar1.Max := SLRepairFiles.Count; DownLoader_Thread :=...

Завершение потока. При закрытии формы программа все равно остается в процессах
Функция потока void ThreadProc() { while (true) { //// } } Создаю поток

2
 Аватар для Kruds
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
23.02.2014, 18:50
Раз уж MyThread не скрывает внутренний поток, то почему бы не сделать так:
C#
1
2
3
4
5
6
7
8
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (mt.thr.IsAlive)
    {
        mt.thr.Abort();
        mt_CloseThread(mt.I.ToString()); //I - свойство MyThread
    }
}
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.02.2014, 19:19  [ТС]
Да, вполне можно... Хотя это тестовый вариант кода, конечно. В своем проекте сделал так:
Вот часть кода основной формы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
       //Метод по событию закрытия формы
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if(searcher!=null)
                if(searcher.StartThread.IsAlive)
                    searcher.ThreadAbort+=new Action<string>(searcher_ThreadAbort);
        }
 
        //Обработчик события при принудительном завершении программы и завершении потока поиска
        private void searcher_ThreadAbort(object str)
        {
            string done_code = (string)str;
            done_code = "Остановка программы произошла на коде: " + done_code;
            var fs = new System.IO.FileStream("done_result.ini", System.IO.FileMode.Create);
            var sw = new System.IO.StreamWriter(fs,Encoding.Default);
            sw.Write(done_code);
            sw.Close();
            fs.Close();
        }
И вот деструктор из класса:
C#
1
2
3
4
5
6
7
8
9
10
       //Деструктор
        ~SearchClass()
        {
            if (Thread.CurrentThread.IsAlive)
            {
                if (ThreadAbort != null)
                    ThreadAbort(CodeFounded);
            }
            GC.Collect();
        }
Попробую с Вашим методом, конечно. А что касается использования деструктора, это допустимо? Просто до этого их не использовал еще...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2014, 19:19
Помогаю со студенческими работами здесь

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

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

Не получается при закрытии формы 2 изменить текст label формы 1
Форма 1: private void Btn_Open_Form2_Click(object sender, EventArgs e) { Form2 forma2 = new Form2(); ...

Завершение программы при закрытии формы только по команде пользователя, а не по закрытию формы кодом
В общем , когда программа открывается срабатывает событие OnShow() и открывается другая форма Form4-&gt;ShowModal(). В этой форме...

Выполнение слота основного потока через сигнал второстепенного потока
Доброго времени суток! Вопрос следующий. В основном потоке создается кнопка и Qlabel class Ui_QtGuiApp4Class { public: //...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru