|
С# Средство разработки на платформе .Net |
07.02.2014, 02:03
|
#1
|
Оператор ЭВМ
Регистрация: 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
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
Сорри. Статичность объекта оказалась ни при чем. Однако во время выполнения программы происходит ошибка: попытка доступа к форме созданной не в этом потоке. Как обойти?
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
07.02.2014, 09:17
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
У формы (Windows.Forms) как и у любого контрола есть метод Invoke, c помощью которого можно вызвать делегат из основного потока. Достаточно сделать что-то типа form.Invoke(()=>{UpdateForm();});
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.02.2014, 12:39
|
#4
|
Оператор ЭВМ
Регистрация: 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
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Сообщение от Dark Dragon
Я попробовал то что ты предложил и вот что получил:
error CS1660: Не удается преобразовать лямбда-выражение в тип "System.Delegate", так как он не является типом делегата
error CS0103: Имя "UpdateForm" отсутствует в текущем контексте
|
ну преобразуй его в Action и метод UpdateForm - это твой метод обновления интерфейса
form.Invoke((Action) (()=>{UpdateForm(param1, param2);}));
...
void UpdateForm(param1, param2) {
}
либо просто
form.Invoke((Action) (()=>{ // код обновления }));
|
(Offline)
|
|
07.02.2014, 22:49
|
#6
|
Оператор ЭВМ
Регистрация: 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
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Что такое Mainwindow? Это тоже самое что и this?
|
(Offline)
|
|
08.02.2014, 16:05
|
#8
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
Mainwindow это главная форма: та самая на которой происходят изменения.
(Поменял имя с Form1).
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
08.02.2014, 17:43
|
#9
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Т.е. это имя класса, а не ссылка на форму? Поменяй на this и должно заработать.
|
(Offline)
|
|
08.02.2014, 22:03
|
#10
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
Супер! Спасибо!
А вот если ты расскажешь как ссылки на объекты делать, то вообще тебе цены не будет!
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
08.02.2014, 22:50
|
#11
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Многопоточность.
все класыс ссылки) ссылки на типы - ref
|
(Offline)
|
|
08.02.2014, 23:26
|
#12
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
Разве ref работает не только ссылка на переменную?
Да и вопрос:"Как передать переменную в поток?" - не снят.
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
09.02.2014, 00:23
|
#13
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
|
(Offline)
|
|
09.02.2014, 15:08
|
#14
|
Оператор ЭВМ
Регистрация: 13.10.2012
Адрес: Российская Федерация,г.Челябинск.
Сообщений: 41
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Многопоточность.
Проблема возникает. Если делать отдельным классом то пропадает возможность взаимодействовать с формой.
Решил так: перенес нужную переменную в внешнюю часть класса, что дало возможность обращаться к ней из обеих функций.
Но встал один вопрос: Почему когда выполняется второй поток у пользователя нет доступа к форме? Она просто зависает. Я думал потоки для того и нужны, чтобы приложение могло работать в нескольких направлениях одновременно.
__________________
P.S.: Если что я этого не говорил
|
(Offline)
|
|
09.02.2014, 16:08
|
#15
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Многопоточность.
Ты что-то сделал не правильно.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:59.
|