Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > C# функция работающая в отдельном потоке


Автор: Rockie 1.9.2007, 00:02
Здравствуйте! 

1) У меня есть форма Form1, на ней label1. есть функция, которая прорисовывает на label текущее время. Хочу запустить ее в отдельном потоке. Чтобы один поток опрашивал системный таймер и прорисовывал время на label, а основной чтобы реагировал на действия пользователя(слушал щелчки мышью и т.п.). Вот http://forum.vingrad.ru/forum/topic-51708/anchor-entry1184491/0.html вроде хороший пример, но у меня он не работает как написано(все цифры по порядку), и там как понял создаются два потока, а мне нужен только один - "побочный", для таймера.. 
Вот пример кода:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ThreadSimpleExampleTimer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void ShowTimerIntoLabel(Label label)
        {
            label.Text =  DateTime.Now.Hour + "." +
                        + DateTime.Now.Minute + "." +
                          DateTime.Now.Second;
        }

    }
}


2) Можно ли регулировать приоритеты потоков? То есть чтобы одному отводилось меньшее процессорное время, а другому - большее?

3) Где доступно на русском описана работа с потоками в .NET 2.0, если можно ссылки?


Автор: QryStaL 1.9.2007, 01:02
1) Кидаешь на форму компонент таймер, ставишь ему интервал 1000. Добавляешь обработчик события Tick.

Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.label1.Text = DateTime.Now.ToString("HH:mm:ss");
        }
    }


2) Свойство Thread.Priority.

3) Основы - Троелсен, Рихтер. Более подробно и углубленно - на английском (есть целые книги, посвященные этой теме, в том числе и МСДН).

Автор: Rockie 1.9.2007, 03:16
QryStaL, понятно, спасибо. Однако в данном случае интересует именно многопоточный вариант. Запуск любой функции в потоке, не обязательно таймер.


Автор: anonym 1.9.2007, 09:10
Пример работы с классом Thread

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        private static void PrintNumbers()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }
        }

        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(PrintNumbers));
            th.Start();            
            Console.WriteLine("Main thread");            
        }
    }
}

Автор: tol05 2.9.2007, 14:40
добавлю ко всему выше сказанному smile

Rockie, пример anonym - классический. Юзай. Только в версии 2.0 появилась возможность кроме делегата ThreadStart юзать еще ParameterizedThreadStart, чему нельзя не радоваться. Можно передавать параметры в поток (создавая массив object[] и упаковывая в него сколько угодно много параметров)...

Кроме того, есть еще пул потоков ThreadPool, для WinForms - компонент BackgroundWorker.
Для выполнения асинхронных операций также есть целая модель АРМ (тут, как сказал QryStaL, действительно лучше всего - Рихтера читать). А попростому - если видишь метод, начинающийся с BeginXXXXXX или EndXXXXXX - то это как раз APM.

ну а для начала можно почитать :
http://rsdn.ru/ (статья "Работа с потоками в C#")
http://www.intuit.ru/department/pl/cil/15/

 

Автор: Rockie 2.9.2007, 17:44
Понял, буду разбираться! smile Всем по репе, спасибо! 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)