Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 4
1

Как правильно создать поток с двумя параметрами

09.04.2012, 02:47. Показов 5118. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблема в том что как правильно мне создать поток.
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
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.Diagnostics;
using System.Threading;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        public double F1(double arg1, double arg2)
        {
            return -1000 * arg1 + 999 * arg2;
        }
 
        public double F2(double arg1, double arg2)
        {
            return arg1 - 2 * arg2;
        }
 
        public double ActualF1(double Arg1)
        {
            return Math.Exp(-Arg1) + Math.Exp(-1001.0 * Arg1);
        }
 
        public double ActualF2(double Arg1)
        {
            return -Math.Exp(-Arg1) - 999 * Math.Exp(-1001.0 * Arg1);
        }
 
        public void method1(double h, double p)
            {
                Stopwatch sWatch = new Stopwatch();
                sWatch.Start();
 
                double yn = 10, yn1, yq = 20, yq1, xn = 0;
                for (; xn < p + h; xn += h)
                {
                    yn1 = yn + h * F1(yn, yq);
 
                    yq1 = yq + h * F2(yn, yq);
 
                    yn = yn1;
                    yq = yq1;
                    exit1.Text = exit1.Text + Convert.ToString(Math.Round(xn, 7)) + "\t" + Convert.ToString(Math.Round(yn1, 7)) + "\t" + Convert.ToString(Math.Round(yq1, 7)) + "\t" + Convert.ToString(Math.Round(ActualF1(xn), 7)) + "\t" + Convert.ToString(Math.Round(ActualF2(xn), 7)) + "\t" + Convert.ToString(Math.Round(yn1 - ActualF1(xn), 7)) + "\t" + Convert.ToString(Math.Round(yq1 - ActualF2(xn), 7)) + Environment.NewLine;
                }
 
                sWatch.Stop();
                time1.Text = Convert.ToString(sWatch.ElapsedMilliseconds);
            
            }
 
        private void button1_Click(object sender, EventArgs e)
        {            
            double h = Convert.ToDouble(textBox1.Text);
            double p = Convert.ToDouble(textBox2.Text);
 
            ТУТ НУЖНО ЗАПУСТИТЬ method1 В ОТДЕЛЬНОМ ПОТОКЕ
        }
 
 
        
    }
}
Добавлено через 1 минуту
Если создаю так:
C#
1
2
Thread myThread = new Thread(Form1.method1(h,p));
myThread.Start();
То у меня выходят такие ошибки:
c:\users\aresss\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(73,42): error CS0120: An object reference is required for the non-static field, method, or property 'WindowsFormsApplication2.Form1.method1(double, double)'
c:\users\aresss\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(46,21): (Related location)
c:\users\aresss\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(73,31): error CS1502: The best overloaded method match for 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' has some invalid arguments
c:\users\aresss\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(73,42): error CS1503: Argument 1: cannot convert from 'void' to 'System.Threading.ThreadStart'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2012, 02:47
Ответы с готовыми решениями:

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

Как создать объект класса с двумя параметрами?
#include &lt;iostream&gt; using namespace std; class rational{ public: rational(int...

Как правильно создать поток?
Есть некий бесконечный цикл, который я хочу повесить его запуск и остановку на кнопки на форме...

Как правильно создать объект Command при помощи мастера с параметрами
Здравствуйте. Делаю программу демонстрирующую объекты Command с использованием именованных...

10
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
09.04.2012, 07:21 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Threading;
 
class Program
{
    public static void method1(double h, double p)
    {
        Console.WriteLine("{0} {1}", p, h);
    }
    static void Main(string[] args)
    {
        ThreadStart start = delegate {
            method1(Math.E, Math.PI);
        };
        Thread thread = new Thread(start);
        thread.Start();
        Console.ReadKey(true);
    }
}
Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
private void button1_Click(object sender, EventArgs e)
{            
    double h = Convert.ToDouble(textBox1.Text);
    double p = Convert.ToDouble(textBox2.Text);
    ThreadStart start = delegate {
        method1(h, p);
    };
    Thread thread = new Thread(start);
    thread.Start()
}
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
09.04.2012, 08:03 3
Если нужно передать метод потоку, то используется метод Start(Object). Для передачи нескольких параметров необходимо объединить нужные параметры в один (в класс или структуру).
Есть еще вариант с замыканием, который предложил Петррр, но он чреват последствиями, если вы не понимаете как работают замыкания.
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
09.04.2012, 08:23 4
держи
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
using System;
using System.Threading;
 
namespace ConsoleApplication3
{
    public class ThreadData
    {
        public string Field1 { get; set; }
        public int Field2 { get; set; }
        public double Field3 { get; set; }
 
        public ThreadData(string field1, int field2, double field3)
        {
            Field1 = field1;
            Field2 = field2;
            Field3 = field3;
        }
 
        public void Print()
        {
            Console.WriteLine(Field1);
            Console.WriteLine(Field2);
            Console.WriteLine(Field3);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem((object sender)=>
            {
                ThreadData data = (ThreadData)sender;
                data.Print();
            }, new ThreadData("Hello World", 12, 47.89));
            Console.ReadKey(true);
        }
    }
}
1
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
09.04.2012, 09:00 5
только называние для параметра нехорошее - sender
1
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 4
09.04.2012, 16:57  [ТС] 6
Цитата Сообщение от turbanoff Посмотреть сообщение
Если нужно передать метод потоку, то используется метод Start(Object). Для передачи нескольких параметров необходимо объединить нужные параметры в один (в класс или структуру).
Есть еще вариант с замыканием, который предложил Петррр, но он чреват последствиями, если вы не понимаете как работают замыкания.
Пытаюсь сделать как там Start(Object).

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void button1_Click(object sender, EventArgs e)
        {   ph vvod = new ph();         
            vvod.h = Convert.ToDouble(textBox1.Text);
            vvod.p = Convert.ToDouble(textBox2.Text);
 
            Thread newThread = new Thread(Form1.method1);
            newThread.Start(vvod);
 
       }
 
                
    }
 
    public class ph
    {
        public double p, h;
    }
Но получаю ошибки:
C:\Users\AreSss\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(73,32): error CS1502: The best overloaded method match for 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' has some invalid arguments
C:\Users\AreSss\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(73,43): error CS1503: Argument 1: cannot convert from 'method group' to 'System.Threading.ThreadStart'
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
09.04.2012, 17:02 7
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
using System;
using System.Threading;
 
public struct Params
{
    public double p, h;
}
 
class Program
{
    static void method1(object par)
    {
        Params param = (Params)par;
        Console.WriteLine("{0} {1}", param.h, param.p);
    }
 
    static void Main(string[] args)
    {
        Thread thread = new Thread(method1);
        Params par = new Params {
            p = Math.PI,
            h = Math.E
        };
        thread.Start(par);
    }
}
0
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 4
09.04.2012, 17:37  [ТС] 8
У меня тоже самое за исключением Console.WriteLine("{0} {1}", param.h, param.p);
Плюс не могу объявить метод статическим так как он работает с формой...
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
10.04.2012, 07:07 9
Цитата Сообщение от AreSss Посмотреть сообщение
У меня тоже самое за исключением Console.WriteLine("{0} {1}", param.h, param.p);
Плюс не могу объявить метод статическим так как он работает с формой...
Покажите, пожалуйста, объявление вашего метода Form1.method1.
0
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 4
10.04.2012, 17:15  [ТС] 10
Цитата Сообщение от turbanoff Посмотреть сообщение
Покажите, пожалуйста, объявление вашего метода Form1.method1.
В первом моём топике всё есть.
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
10.04.2012, 17:24 11
AreSss, ну так если протереть глаза то можно увидеть что у меня передается объект.
0
10.04.2012, 17:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2012, 17:24
Помогаю со студенческими работами здесь

Как правильно создать отдельный поток и из него изменять форму?
Пробую создать поток так (вложение) но появляються ошибки ругаеться на _beginthread(UpdateData,...

Создать свой класс с двумя конструкторами 2 или 3 функциями и 5 параметрами
Добрый вечер, в школе задали написать программу с классами, но я совсем не понимаю как должна...

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

Как запросить из базы строки с двумя параметрами?
Скажите плз, есть запрос в бд $sqlnew_mod = &quot;SELECT * FROM w_hudi WHERE id_cat='$id_cat' ORDER BY...


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

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