Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 25.12.2011
Сообщений: 9
1

Передача параметров в поток, модифицировать код

01.10.2012, 17:24. Показов 1946. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно сделать из однопоточной версии многопоточную. Когда начинаю передавать параметры в поток пишет:
No overload for 'Eratosfen' matches delegate 'System.Threading.ParameterizedThreadStart'
No overload for 'Fibonachi' matches delegate 'System.Threading.ParameterizedThreadStart'
No overload for 'Factorial' matches delegate 'System.Threading.ParameterizedThreadStart'

Что я делаю не так? Вот код програмы:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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.Management.Instrumentation;
namespace SPO_2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //Эратосфен
            int ERA;
            ERA =Convert.ToInt32(textBox1.Text);
            Eratosfen(ERA);
 
            //Фибоначчи
            int fib;
            fib = Convert.ToInt32(textBox2.Text);
            Fibonachi(fib);
        
            //Факториал
            int fact;
            fact = Convert.ToInt32(textBox3.Text);
            Factorial(fact);
 
            //Потоки
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            Thread thread1 = new Thread(new ParameterizedThreadStart(Eratosfen));
            thread1.Start(ERA);
            Thread thread2 = new Thread(new ParameterizedThreadStart(Fibonachi));
            thread2.Start(fib);
            Thread thread3 = new Thread(new ParameterizedThreadStart(Factorial));
            thread3.Start(fact);
            thread1.Join();
            thread2.Join();
            thread3.Join();
        }
 
        public void Eratosfen(int n)
        {
            string r;
            int[] ERAmas = new int[n];
            for (int i = 0; i < n; i++)
            {
                ERAmas[i] = i+1;
            }
            for (int i = 1; i < n; i++)
            {
                if (ERAmas[i] != 0)
                {
                    for (int j = i + 1; j < n; j++)
                    {
                        if (ERAmas[j] % ERAmas[i] == 0)
                            ERAmas[j] = 0;
                    }
                }
            }
            for (int i =0; i < n; i++)
            {
                if (ERAmas[i] != 0)
                {
                    r = Convert.ToString(ERAmas[i]);
                    listBox1.Items.Add("Решето Эратосфена" +" "+ r);
                }
            }
        }
        public void Fibonachi(int n)
        {
            listBox1.Items.Add(" ");
            string r = "";
            int[] REZFIB = new int[n];
            REZFIB[0] = 1;
            REZFIB[1] = 2;
            for (int i = 2; i < n; i++)
            {
                REZFIB[i] = REZFIB[i - 2] + REZFIB[i - 1];
            }
            for (int i = 0; i < n; i++)
            {
                r = Convert.ToString(REZFIB[i]);
                listBox1.Items.Add("Числа Фибоначчи"+" "+r);
            }
        }
        public void Factorial(int n)
        {
            listBox1.Items.Add(" ");
            string r = "";
            int rez = 1;
            for (int i = 1; i < n + 1; i++)
            {
                rez = i * rez;
            }
            r = Convert.ToString(rez);
            listBox1.Items.Add("Факториал"+" "+r);          
        }
    }
}
Вложения
Тип файла: zip SPO_2.zip (34.1 Кб, 5 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2012, 17:24
Ответы с готовыми решениями:

Передача параметров в поток
Всем привет! Знаю что тема где-то была, не нашел. Нужно запустить в потоке метод с параметрами без...

Передача в поток несколько параметров
В отдельном потоке делаю открытие окна. Нужно в поток передать текст для заголовка окна и...

Передача параметров в поток и возврат результата
Нужно распараллелить одну задачу и для этого передавать параметры в поток, а затем возвращать...

Передача параметров в поток
Создаю и запускаю потоки так: // CountThreads - кол-во потоков, введенных через поле ввода...

12
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.10.2012, 17:46 2
C#
1
public void Eratosfen(int n)
замени на
C#
1
2
public void Eratosfen(object o){
   int n = o as int;
ну и с другими так же. но имей ввиду, что из других трэйдов ты не сможешь так запросто сделать в твоей ф-ии:
C#
1
listBox1.Items.Add("Решето Эратосфена" +" "+ r);
1
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
01.10.2012, 17:48 3
Тип параметра для делегатов должен быть object, а не int.
Переделайте все методы:
C#
1
2
3
        public void Factorial(object objectParameter)
        {
           int n = (int)objectParameter;
Добавлено через 26 секунд
Цитата Сообщение от novi4ok Посмотреть сообщение
int n = o as int;
as не может применяться к int.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.10.2012, 17:54 4
Цитата Сообщение от turbanoff Посмотреть сообщение
as не может применяться к int.
вполне допускаю. но с этим тс справится самостоятельно за секунды. я такую ерунду в голове стараюсь не держать.
1
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
01.10.2012, 18:10 5
Цитата Сообщение от novi4ok Посмотреть сообщение
вполне допускаю. но с этим тс справится самостоятельно за секунды. я такую ерунду в голове стараюсь не держать.
Это да, но только если он знает, что такое as..
Кстати, есть логический смысл, почему value-типы и as не совместимы. Потому что as предполагает возможность вернуть null, а присваивать null можно только ссылочным и nullable типам.
2
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.10.2012, 18:15 6
логический смысл можно найти везде при желании. но как-то выруливает компилятор и рантайм, если написать
C#
1
int i = (int) "abcd";
?
вопрос формы записи токмо. просто решили сделать так, могли и иначе, и тоже был бы "логический смысл".
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.10.2012, 21:28 7
за эту строчку
C#
1
 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
прибить мало.... студенты..... что и говорить
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.10.2012, 21:59 8
держи и учись... студент...

писал на MS VS 2010 так что не обсудь, если что выковыряй *.cs файлы и сделай импорт в 2008
Вложения
Тип файла: zip SPO_2.zip (42.2 Кб, 16 просмотров)
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.10.2012, 22:04 9
Цитата Сообщение от turbanoff Посмотреть сообщение
as не может применяться к int.
Да что вы говорите... а как же операция "is" которая вместе с операцией "as" в C# применяется при касте объектов к нужному типу?
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
05.10.2012, 23:29 10
агерон, да ладно, а как же то, что as возвращает null? Или в вашем C# в порядке вещей ValueType'ам присваивать null?
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
05.10.2012, 23:56 11
а null дорогой не ошибка... а результат некоректного использования операции, я не зря упомянул операцию "is"... корректное приведение типов выглядит так!
C#
1
2
 if (data is ValueType)
  ValueType result = data as ValueType
а прямой каст
C#
1
 ValueType data = (ValueType)data;
в случае когда data = null приведет к NullReferenceException, либо к другим исключениям приведения типа если тип data не является ValueType или его наследником
Учите мат часть юноша
0
Yukikaze
06.10.2012, 01:54
  #12

Не по теме:

Я не знаю, какие наркотики вы принимаете, но мелкомягким думаю виднее

Пример -> Последствия

1
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
08.10.2012, 06:17 13
Да был не прав... признаю, просто давно не работал на прямую с преобразованием ValueType... все больше классы да классы :-D, вот и ошибся немного
0
08.10.2012, 06:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2012, 06:17
Помогаю со студенческими работами здесь

Передача в поток параметров
Ку. Надо создать поток, а потом, стартовать с заданными параметрами.. Пробую так: Thread thread =...

Передача параметров (тоесть больше 1) в поток
int id = 1; string qqq = &quot;qqq&quot;; Thread x = new Thread(qwer); x.Start(); // если бы добавили ещё...

Передача параметров в поток
Добрый день. Имеется основная форма, где объявлена переменная AnsiString LineMessage. Там же в нее...

Передача параметров в поток
Почему в потоке (точнее в функции, которую он отрабатывает) после преобразования указателя &quot;r2&quot; к...

Передача параметров в поток
Помогите пожалуйста, не могу понять, как правильно передать параметр в поток. printf(&quot;Listening...

Передача параметров в поток
Существует функция: pubic: void Func() { // что-то делает } Она вызывается из основной...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru