Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
beats
100 / 40 / 9
Регистрация: 09.12.2012
Сообщений: 586
1

Передать объект класса как аргумент метода в поток

13.07.2014, 22:42. Просмотров 4142. Ответов 5
Метки нет (Все метки)

Имеется класс npimono, код использования:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  private void loadListButton_Click(object sender, EventArgs e)
        {
            //backgroundWorker1.RunWorkerAsync();
            //this.progressBar1.MarqueeAnimationSpeed = 30;
            //this.progressBar1.Style = ProgressBarStyle.Marquee;
            npimono npimonoObj = new npimono();
            //npimonoObj.getAbitData();
            //while (progressBar1.Value <= 99) progressBar1.Value = npimonoObj.urlsListCountNow;
            Thread myThread2 = new Thread(progressBarWhile); //Создаем новый объект потока (Thread)
            myThread2.Start(npimonoObj); //запускаем поток
            //npimonoObj.urlsList.Add
            
        }
 
 
        void progressBarWhile(npimono npimonoObj)
        {
            while (progressBar1.Value <= 99) progressBar1.Value = npimonoObj.urlsListCountNow;
        }
В итоге копилятор жалуйтеся(( код не выполняется(
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2014, 22:42
Ответы с готовыми решениями:

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void...

Как увидеть объект Session и объект Server из модуля класса?
В модуле класса пишу: 'Provider=Microsoft.Jet.OLEDB.4.0;' &amp; _ 'Data Source=' &amp;...

Как передать второй аргумент в File.WriteAllLines(path, string[])?
Хочу создать файл и записать в него текст с помощью File.WriteAllLines. Возникли проблемы со...

Как передать объект класса в метод класса?
Здравствуйте, каким образом передать объект класса в метод класса? Вот код: class Program {...

Как правильно передать объект класса по ссылке
Подскажите, хочу передать объект класса Image, im, компилятор пишет требуется ссылка на объект, как...

5
Casper-SC
Эксперт .NET
4082 / 1934 / 377
Регистрация: 27.03.2010
Сообщений: 5,322
Записей в блоге: 1
14.07.2014, 01:04 2
Гениальное описание проблемы "Жалуется" - понятие растяжимое. Есть мысли, конечно, но всё же...

Добавлено через 2 минуты
Тут мало описания проблемы, кстати. Мало просто текста ошибки, расскажи что хочешь сделать и почему делаешь именно так. Просто мне не совсем понятно почему именно так:
C#
1
2
3
4
  void progressBarWhile(npimono npimonoObj)
        {
            while (progressBar1.Value <= 99) progressBar1.Value = npimonoObj.urlsListCountNow;
        }
По идее течения прогресса ты не увидишь никак, просто вообще никак и никогда. Всё произойдёт очень быстро.

Добавлено через 5 минут
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Task.Factory.StartNew(
                (maxValue) =>
                {
                    int max = (int) maxValue;
                    for (int i = 0; i < max; i++)
                    {
                        Thread.Sleep(50);
                        Progress(i + 1);
                    }
                }, progressBar1.Maximum);
        }
 
        private void Progress(int value)
        {
            if (progressBar1.InvokeRequired)
                progressBar1.Invoke(new Action<int>(Progress), value);
            else
                progressBar1.Value = value;
        }
    }
}
Добавлено через 4 минуты
Чуть поправил код

Добавлено через 3 минуты
Ещё раз поправил, теперь всё норм
0
beats
100 / 40 / 9
Регистрация: 09.12.2012
Сообщений: 586
17.07.2014, 11:46  [ТС] 3
Цитата Сообщение от Casper-SC Посмотреть сообщение
По идее течения прогресса ты не увидишь никак, просто вообще никак и никогда. Всё произойдёт очень быстро.
Все отлично видно. Решил проблему вынесом объявление объекта класса в глобальную переменную.
0
Psilon
Master of Orion
Эксперт .NET
6043 / 4901 / 903
Регистрация: 10.07.2011
Сообщений: 14,516
Записей в блоге: 5
Завершенные тесты: 4
17.07.2014, 17:53 4
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

beats, глобальные переменные есмь зло.

Делать нужно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void loadListButton_Click(object sender, EventArgs e)
        {
            npimono npimonoObj = new npimono();
            Thread myThread2 = new Thread(progressBarWhile); //Создаем новый объект потока (Thread)
            myThread2.Start(npimonoObj); //запускаем поток
        }
 
 
        void progressBarWhile(object o)
        {
            var pb = (npimono) o;
            while (progressBar1.Value <= 99) progressBar1.Value = npimonoObj.urlsListCountNow;
        }
0
beats
100 / 40 / 9
Регистрация: 09.12.2012
Сообщений: 586
18.07.2014, 12:45  [ТС] 5
Psilon, наверное ты прав. Спасибо, это и есть ответ на мой вопрос.
но возникла еще одна сложность( Сам проект я собираю для множества платформ, и в адроиде например все работает, а под виндоус системами пишет ошибку, мол нет доступа к progressBar1 если в методе к нему обращаться(

Добавлено через 40 секунд
или вернее в потоке
0
insite2012
Модератор
Эксперт .NET
4935 / 3876 / 1109
Регистрация: 12.10.2013
Сообщений: 11,215
Записей в блоге: 2
18.07.2014, 12:53 6
Цитата Сообщение от beats Посмотреть сообщение
нет доступа к progressBar1
Цитата Сообщение от beats Посмотреть сообщение
в потоке
Естественно не будет. Доступ к элементам управления возможен только из того потока, в котором они были созданы. Нужен маршалинг через Invoke()-BeginInvoke().
0
18.07.2014, 12:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 12:53

Как изменить аргумент метода в откомпилированной программе?
Добрый день. Как пример, есть такая программа: ... static void Main(string args) { ...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

Как из метода производного класса вызвать поле родительского класса
Добрый день! Помогите пожалуйста вызвать поле базового класса из метода производного класса. Код,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.