Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2010, 16:29   #1
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
Смущение Как остановить поток?

Здравствуйте ещё раз, ув. программисты!

У меня проблема в коде, я не могу остановить поток. Кнопка button1_Click работает как для начала потока, так и для завершения. То есть
Код:
bClicked++;
 if (bClicked % 2 == 1)
и
Код:
if (bClicked % 2 == 0)
- проверки на чётное и нечётное нажатие.

При второй проверке должен останавливаться поток, а он продолжается.
Вот код всей программы

Код:
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;
using System.IO;
using System.Xml;

namespace MyLogger
{
    public enum MessageType { Info, Error, Debug, Warning }

    public interface ILogger
    {
        void Log(string message, MessageType messageType);
    }

    public partial class Form1 : Form
    {
        protected int bClicked = 0;

        public Form1()
        {
            InitializeComponent();
        }

        //Main:
        private void button1_Click(object sender, EventArgs e)
        {
            MessageGenerator msgen = new MessageGenerator(1000);
            bClicked++;
            if (bClicked % 2 == 1)      //Start
            {
                ILogger lg1 = new TxtLogger();
                ILogger lg2 = new XmlLogger();
                ILogger lg3 = new DbLogger();

                lg1.Log("msg1", MessageType.Info);
                lg1.Log("msg2", MessageType.Debug);

                lg2.Log("msgOne", MessageType.Debug);
                lg2.Log("msgTwo", MessageType.Warning);

                msgen.go();
            }
            if (bClicked % 2 == 0)
            {
                msgen.stop();                        //Stop
            }
        }
    }

    class TxtLogger : ILogger
    {
        protected string FileName = "C:\\Documents and Settings\\Admin\\Desktop\\output1.txt";
        public void Log(string message, MessageType messageType)
        {
            FileStream f1 = new FileStream(FileName, FileMode.Append);
            StreamWriter output = new StreamWriter(f1);
            output.WriteLine("Message text: " + message + ", " + DateTime.Now.ToString() + ", Type: " + messageType);
            output.Close();
            f1.Close();
        }
    }

    class XmlLogger : ILogger
    {
        protected string FileName = "C:\\Documents and Settings\\Admin\\Desktop\\output2.xml";
        public void Log(string message, MessageType messageType)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.IndentChars = "    ";
            settings.NewLineChars = "\n";
            settings.OmitXmlDeclaration = true;
 
            using (XmlWriter output = XmlWriter.Create(FileName, settings))
            {
                output.WriteStartElement("logging");
                output.WriteElementString("log", "Message text: " + message + ", " + DateTime.Now.ToString() + ", Type: " + messageType);
                output.WriteEndElement();
                output.Flush();
            }          
                   
        }

    }

    class DbLogger : ILogger
    {
        public void Log(string message, MessageType messageType)
        {
            // Запись в БД
        }
    }

    class MessageGenerator
    {
        protected string str;
        protected int mseconds;
        protected bool stopThread;
        protected ThreadStart myThreadDelegate;
        protected Thread thr;
        protected int n = 0;

        public MessageGenerator(int mseconds)
        {
            this.mseconds = mseconds;
            stopThread = false;
        }

        public void Generate()
        {
            for (; ; )
            {
                if (stopThread) break;
                n++;
                str = n.ToString();
                MessageBox.Show(str);
                Thread.Sleep(mseconds);
            }
            MessageBox.Show("Thread generate was stopped...");
        }

        public void go()
        {
            myThreadDelegate = new ThreadStart(Generate);
            thr = new Thread(myThreadDelegate);
            thr.Start();
        }

        public void stop()
        {
            stopThread = true;
        }

    }
}
pa6kevi4 вне форума Ответить с цитированием
Старый 03.06.2010, 16:39   #2
Cpluser
Форумчанин
 
Аватар для Cpluser
 
Регистрация: 16.02.2009
Сообщений: 555
По умолчанию

thr.Abort();
Так можно все потоки убить:
Thread.CurrentThread.Abort();
Cpluser вне форума Ответить с цитированием
Старый 03.06.2010, 20:01   #3
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
По умолчанию

Даже если я использую Thread.CurrentThread.Abort(); останавливается только главный поток, а бесконечный цикл продолжает работать

Так мой главный вопрос не решён: почему если я второй раз нажимаю на кнопку, поток не останавливается.
pa6kevi4 вне форума Ответить с цитированием
Старый 03.06.2010, 20:31   #4
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Цитата:
а бесконечный цикл продолжает работать
А прервать этот бесконечный цикл никак?
dampirik вне форума Ответить с цитированием
Старый 04.06.2010, 08:52   #5
pa6kevi4
Пользователь
 
Регистрация: 15.09.2009
Сообщений: 52
По умолчанию

В том то и дело что никак. Можете подкинуть идею как это сделать? Посмотрите, у меня там уже стоит проверка
pa6kevi4 вне форума Ответить с цитированием
Старый 04.06.2010, 17:28   #6
Cpluser
Форумчанин
 
Аватар для Cpluser
 
Регистрация: 16.02.2009
Сообщений: 555
По умолчанию

А чем вам break не подходит или сделайте переменную bool.
Cpluser вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вовремя остановить поток T-dayne Помощь студентам 1 06.04.2010 11:23
Как остановить поток а потом снова запустить? Des Общие вопросы Delphi 5 03.05.2009 12:35
как программно остановить программу Doget Помощь студентам 3 16.01.2009 07:45
Как остановить процесс Volkogriz Общие вопросы Delphi 1 15.01.2009 10:40
Как остановить поток? Никки Win Api 3 06.12.2007 22:04