Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

многопоточность в .net

6.3K
04 февраля 2005 года
kipelovets
7 / / 08.04.2004
здравствуйте.
помогите, пожалуйста, разобраться с многопоточностью в .net.
моя прога на c# 2005 коннектится с помощью System.Net.Sockets.TcpClient к серверу и что-нибудь качает в отдельном потоке. проблема вот в чем: надо, чтобы по мере скачивания заполнялся, например, progressBar в форме (в основном потоке). задача вроде элементарная, но в синхронизацию потоков я абсолютно не вьезжаю...:(
319
05 февраля 2005 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by kipelovets
здравствуйте.
помогите, пожалуйста, разобраться с многопоточностью в .net.
моя прога на c# 2005 коннектится с помощью System.Net.Sockets.TcpClient к серверу и что-нибудь качает в отдельном потоке. проблема вот в чем: надо, чтобы по мере скачивания заполнялся, например, progressBar в форме (в основном потоке). задача вроде элементарная, но в синхронизацию потоков я абсолютно не вьезжаю...:(


можно использовать делегатов - из потока скачивания активировать события (по мере скачивания) и отлавливать эти события в основном потоке.

6.3K
06 февраля 2005 года
kipelovets
7 / / 08.04.2004
Цитата:
Originally posted by xelos

можно использовать делегатов - из потока скачивания активировать события (по мере скачивания) и отлавливать эти события в основном потоке.


А поподробнее можно?

319
07 февраля 2005 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by kipelovets

А поподробнее можно?


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

Код:
namespace CommPort
{
    /// <summary>
    /// Объявляем делегата
    /// </summary>
    public delegate void DataReceived(object sender, CommEvent e);
    /// <summary>
    /// Класс события
    /// </summary>
    public class CommEvent:EventArgs
    {
        ....
    }

    /// <summary>
    /// Первый класс, который посылает сообщение
    /// </summary>
    public class CommPort
    {
        public event DataReceived dReceived;
        /// <summary>
        /// Переменная события
        /// </summary>
        private CommEvent ce;
//объявляем событие
        public event DataReceived dReceived;

        /// <summary>
        /// поток для прослушивания
        /// </summary>
        private Thread listenThread;
        /// <summary>
        /// запуск потока для прослушивания
        /// </summary>
        public void StartListenThread()
        {
            listenThread = new Thread(new ThreadStart(ListenForData));
            listenThread.Start();
            ListenThreadState=true;
        }
        /// <summary>
        /// функция потока
        /// </summary>
        private void ListenForData()
        {
            //listen pour un octet
            byte[] ReceptionBuffer=new byte[1];
            UInt32 ReadBytes;
            while (ListenThreadState)
            {
                if (Read(ReceptionBuffer,1,out ReadBytes)==true)
                {
                    if (ReadBytes>0)
                    {
                        ce = new CommEvent(CommEventType.ByteReceived);
                        ce.SetArgums(ReceptionBuffer, (byte)(ReadBytes));
                        dReceived(this, ce);
                    }
                }
            }
        }
      }
//Второй класс, где ловим событие
    /// <summary>
    ///
    /// </summary>
    public class ModBus
    {
//переменная класса порта
        private CommPort.CommPort cport;
        public ModBus(string port)
        {
//цепляем событие
            cport.dReceived+= new CommPort.DataReceived(comm_Received);
        }
//функция олавливания события
        private void comm_Received (object sender, CommEvent ce)
        {
            commMessage = new byte[ce.GetLength()];
            commMessage = ce.GetArgums();
        }
}

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

во втором классе, в переменной первого класса цепляем событие к конкретной функции (сигнатура метода должна быть идентичной сигнатуре делегата)
второй класс успешно ловит события, отправляемые первым.
48K
07 апреля 2009 года
MaSTeR_Alexandr
1 / / 07.04.2009
Насколько я знаю для .Net написаны прекрасные классы для работы с потоками - backgroundworker к примеру... достаточно, просто правильно написать его обработку и все будет замечательно не придется писать столько лишнего кода... На мой взгляд то оптимальное решение....
5
08 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: MaSTeR_Alexandr
Насколько я знаю для .Net...

Некрофилия, знаете ли тут не поощряется.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог