forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Многопоточность. (http://forum.boolean.name/showthread.php?t=18918)

Dark Dragon 07.02.2014 02:03

Многопоточность.
 
Привет всем, и снова мне нужна ваша помощь.:SOS:
Подскажите как реализовать в C# многопоточность, если при этом мне необходима связь функции нового потока с формой (соответственно она не может быть статической). Да и нужно при этом передать в эту функцию некоторые переменные.
Пробовал так:

Код:

  Thread myThread = new Thread(Things); //Создаем новый объект потока (Thread)

            myThread.Start(); //запускаем поток

Не помогло. Выдает ошибку с нестатичностью функции. Пробовал делать так:

Код:

  private void button1_Click(object sender, EventArgs e)
        {
         
                Thread myThread = new Thread(func);
                myThread.Start();
         
        }

        static void func()
        {
            Things();
        }

просит сделать ссылку на нестатический объект.
Да и пробовал делать так:

Код:

private void button1_Click(object sender, EventArgs e)
        {
         
                Thread myThread = new Thread(func(s));
                myThread.Start();
         
        }
// ====================================================
        static void func(string s)
        {

        }

тут жалуется на недопустимые аргументы.

Dark Dragon 07.02.2014 02:10

Ответ: Многопоточность.
 
Сорри. Статичность объекта оказалась ни при чем. Однако во время выполнения программы происходит ошибка: попытка доступа к форме созданной не в этом потоке. Как обойти?

pax 07.02.2014 09:17

Ответ: Многопоточность.
 
У формы (Windows.Forms) как и у любого контрола есть метод Invoke, c помощью которого можно вызвать делегат из основного потока. Достаточно сделать что-то типа form.Invoke(()=>{UpdateForm();});

Dark Dragon 07.02.2014 12:39

Ответ: Многопоточность.
 
Цитата:

Сообщение от pax (Сообщение 273845)
У формы (Windows.Forms) как и у любого контрола есть метод Invoke, c помощью которого можно вызвать делегат из основного потока. Достаточно сделать что-то типа form.Invoke(()=>{UpdateForm();});

Я попробовал то что ты предложил и вот что получил:

error CS1660: Не удается преобразовать лямбда-выражение в тип "System.Delegate", так как он не является типом делегата
error CS0103: Имя "UpdateForm" отсутствует в текущем контексте

pax 07.02.2014 16:29

Ответ: Многопоточность.
 
Цитата:

Сообщение от Dark Dragon (Сообщение 273851)
Я попробовал то что ты предложил и вот что получил:

error CS1660: Не удается преобразовать лямбда-выражение в тип "System.Delegate", так как он не является типом делегата
error CS0103: Имя "UpdateForm" отсутствует в текущем контексте

ну преобразуй его в Action и метод UpdateForm - это твой метод обновления интерфейса

PHP код:

form.Invoke((Action) (()=>{UpdateForm(param1param2);}));

...

void UpdateForm(param1param2)
{



либо просто
PHP код:

form.Invoke((Action) (()=>{
// код обновления
})); 


Dark Dragon 07.02.2014 22:49

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

private void button1_Click(object sender, EventArgs e)
        {
            string say= textbox1.text;
            Thread thd = new Thread(Thinks);             
        }
void Thinks()
        {
            Mainwindow.Invoke((Action)(() =>
                {
            if (ans != "11")
            {
              //вычисления с занесением в текстбокс2 и файл;           
            }
            else
            {
              //действие с иным компонентом этой же формы;
            }
                }));


pax 08.02.2014 10:58

Ответ: Многопоточность.
 
Что такое Mainwindow? Это тоже самое что и this?

Dark Dragon 08.02.2014 16:05

Ответ: Многопоточность.
 
Mainwindow это главная форма: та самая на которой происходят изменения.
(Поменял имя с Form1).

pax 08.02.2014 17:43

Ответ: Многопоточность.
 
Т.е. это имя класса, а не ссылка на форму? Поменяй на this и должно заработать.

Dark Dragon 08.02.2014 22:03

Ответ: Многопоточность.
 
Супер! Спасибо!
А вот если ты расскажешь как ссылки на объекты делать, то вообще тебе цены не будет!

Dream 08.02.2014 22:50

Ответ: Многопоточность.
 
все класыс ссылки) ссылки на типы - ref

Dark Dragon 08.02.2014 23:26

Ответ: Многопоточность.
 
Разве ref работает не только ссылка на переменную?
Да и вопрос:"Как передать переменную в поток?" - не снят.

pax 09.02.2014 00:23

Ответ: Многопоточность.
 
Можно тут почитать про разные типы данных
Про параметры и потоки тут

Dark Dragon 09.02.2014 15:08

Ответ: Многопоточность.
 
Проблема возникает. Если делать отдельным классом то пропадает возможность взаимодействовать с формой.
Решил так: перенес нужную переменную в внешнюю часть класса, что дало возможность обращаться к ней из обеих функций.
Но встал один вопрос: Почему когда выполняется второй поток у пользователя нет доступа к форме? Она просто зависает. Я думал потоки для того и нужны, чтобы приложение могло работать в нескольких направлениях одновременно.

pax 09.02.2014 16:08

Ответ: Многопоточность.
 
Ты что-то сделал не правильно.


Часовой пояс GMT +4, время: 18:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot