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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2008, 00:57   #1
madmax08
 
Регистрация: 15.07.2008
Сообщений: 6
Счастье Многопоточное программирование

Здравствуйте. Вот грубое но максимально простое объяснение того что нужно.

напрмер есть цикл

Код:
int a=0;
while(true)
a++
и надо что бы в форме писалось значение a!
но если например поместить этот цикл в OnLoad то форма перестанет отвечать.
тоесть надо чтобы цикл работал сам по себе форма сама по себе. как так сделать?

Последний раз редактировалось merax; 15.07.2008 в 07:05.
madmax08 вне форума Ответить с цитированием
Старый 15.07.2008, 07:04   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Код:
       using System.Threading;

       Thread t;

        private void TestInc()
        {
            int a = 0;

            while(true)
            {
                a++;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            t = new Thread(delegate() { TestInc(); });
            t.Start();            
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            t.Abort();
        }
P.S. А следующий вопрос наверное будет - "Как организовать межпоточное взаимодействие" !!!
merax вне форума Ответить с цитированием
Старый 15.07.2008, 09:24   #3
madmax08
 
Регистрация: 15.07.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от merax Посмотреть сообщение
P.S. А следующий вопрос наверное будет - "Как организовать межпоточное взаимодействие" !!!
Ура ура это действует! спасибо)

Код:
int a;
    private void TestInc()
    {
        for (a = 0; a < int.MaxValue;)
        a++;
    
        t.Abort(); 
        
    }
в форме поставил таймер и каждую секунду

Код:
progressBar1.Value = a;
но когда я в цикле пытаюсь написать

Код:
  private void TestInc()
    {
        for (a = 0; a < int.MaxValue;a++)
        progressBar1.Value = a;
    
        t.Abort(); 
        
    }
он пишет что то про кроспотоки) почему к а доступ есть а к прогрес бару нет ведь они оба за пределами функции.
как сделать так что бы можно было изменять значения progressBar1?
спасибо

moderator: Используйте тег <CODE>

Последний раз редактировалось merax; 15.07.2008 в 10:11.
madmax08 вне форума Ответить с цитированием
Старый 15.07.2008, 10:02   #4
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Доступа нет потому что progressBar1 порожден в главном потоке приложения. А по правилам безопастного доступа к объектам и концепции NET, изменятся он может только из того потока в котором создан. Для безопастного межпоточного взаимодействия в дотнете создан механизм делегатов(delegate) вот его простейшая реализация на твоем примере.


Код:
using System.Threading;

Thread t;

delegate void IncProgressBar(int Value);

private void CallBack(int Value)
{
     progressBar1.Value = Value;
}

private void TestInc()
{
   int a = 0;

   IncProgressBar s = new IncProgressBar(CallBack);

   for (int i = 0; i < 100; i++)
   {
         progressBar1.Invoke(s, i);
         Thread.Sleep(7);
   }
}

private void button2_Click(object sender, EventArgs e)
{
     t = new Thread(delegate() { TestInc(); });
     t.Start();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
     t.Abort();
}

Последний раз редактировалось merax; 15.07.2008 в 10:09.
merax вне форума Ответить с цитированием
Старый 15.07.2008, 23:58   #5
madmax08
 
Регистрация: 15.07.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от merax Посмотреть сообщение
Доступа нет потому что progressBar1 порожден в главном потоке приложения. А по правилам безопастного доступа к объектам и концепции NET, изменятся он может только из того потока в котором создан. Для безопастного межпоточного взаимодействия в дотнете создан механизм делегатов(delegate) вот его простейшая реализация на твоем примере.


Код:
using System.Threading;

Thread t;

delegate void IncProgressBar(int Value);

private void CallBack(int Value)
{
     progressBar1.Value = Value;
}

private void TestInc()
{
   int a = 0;

   IncProgressBar s = new IncProgressBar(CallBack);

   for (int i = 0; i < 100; i++)
   {
         progressBar1.Invoke(s, i);
         Thread.Sleep(7);
   }
}

private void button2_Click(object sender, EventArgs e)
{
     t = new Thread(delegate() { TestInc(); });
     t.Start();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
     t.Abort();
}
спасибо что подсказали.
madmax08 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программирование фамил Свободное общение 10 23.09.2009 14:28
Многопоточное соединение сервер-клиент ShadowMaster Работа с сетью в Delphi 5 15.08.2008 16:36
программирование на си фамил Общие вопросы C/C++ 3 31.05.2008 20:03
Программирование под .NET RoamingFire Свободное общение 1 04.03.2008 08:35
ПРограммирование Андрюха из ПХТТ Фриланс 3 04.02.2008 21:25