Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 07.02.2014, 02:03   #1
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Многопоточность.

Привет всем, и снова мне нужна ваша помощь.
Подскажите как реализовать в 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)
        {

        }
тут жалуется на недопустимые аргументы.
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 07.02.2014, 02:10   #2
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Сорри. Статичность объекта оказалась ни при чем. Однако во время выполнения программы происходит ошибка: попытка доступа к форме созданной не в этом потоке. Как обойти?
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 07.02.2014, 09:17   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Многопоточность.

У формы (Windows.Forms) как и у любого контрола есть метод Invoke, c помощью которого можно вызвать делегат из основного потока. Достаточно сделать что-то типа form.Invoke(()=>{UpdateForm();});
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (08.02.2014)
Старый 07.02.2014, 12:39   #4
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

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

error CS1660: Не удается преобразовать лямбда-выражение в тип "System.Delegate", так как он не является типом делегата
error CS0103: Имя "UpdateForm" отсутствует в текущем контексте
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 07.02.2014, 16:29   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Многопоточность.

Сообщение от Dark Dragon Посмотреть сообщение
Я попробовал то что ты предложил и вот что получил:

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

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

...

void UpdateForm(param1param2)
{


либо просто
form.Invoke((Action) (()=>{
// код обновления
})); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 07.02.2014, 22:49   #6
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Ему все равно не нравится нестатичность формы, и он требует ссылку на нее. Может я не туда вставил предложенный тобой код? ты может поконкретнее указать куда что вставляется. К примеру моя программа сейчас выглядит так:
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
            {
              //действие с иным компонентом этой же формы;
            }
                }));
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 08.02.2014, 10:58   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Многопоточность.

Что такое Mainwindow? Это тоже самое что и this?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 08.02.2014, 16:05   #8
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Mainwindow это главная форма: та самая на которой происходят изменения.
(Поменял имя с Form1).
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 08.02.2014, 17:43   #9
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Многопоточность.

Т.е. это имя класса, а не ссылка на форму? Поменяй на this и должно заработать.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 08.02.2014, 22:03   #10
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Супер! Спасибо!
А вот если ты расскажешь как ссылки на объекты делать, то вообще тебе цены не будет!
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 08.02.2014, 22:50   #11
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Многопоточность.

все класыс ссылки) ссылки на типы - ref
(Offline)
 
Ответить с цитированием
Старый 08.02.2014, 23:26   #12
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Разве ref работает не только ссылка на переменную?
Да и вопрос:"Как передать переменную в поток?" - не снят.
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 09.02.2014, 00:23   #13
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Многопоточность.

Можно тут почитать про разные типы данных
Про параметры и потоки тут
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 09.02.2014, 15:08   #14
Dark Dragon
Оператор ЭВМ
 
Аватар для Dark Dragon
 
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Многопоточность.

Проблема возникает. Если делать отдельным классом то пропадает возможность взаимодействовать с формой.
Решил так: перенес нужную переменную в внешнюю часть класса, что дало возможность обращаться к ней из обеих функций.
Но встал один вопрос: Почему когда выполняется второй поток у пользователя нет доступа к форме? Она просто зависает. Я думал потоки для того и нужны, чтобы приложение могло работать в нескольких направлениях одновременно.
__________________
P.S.: Если что я этого не говорил
(Offline)
 
Ответить с цитированием
Старый 09.02.2014, 16:08   #15
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Многопоточность.

Ты что-то сделал не правильно.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Dream (09.02.2014)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com