Многопоточность.
Привет всем, и снова мне нужна ваша помощь.:SOS:
Подскажите как реализовать в C# многопоточность, если при этом мне необходима связь функции нового потока с формой (соответственно она не может быть статической). Да и нужно при этом передать в эту функцию некоторые переменные. Пробовал так: Код:
Thread myThread = new Thread(Things); //Создаем новый объект потока (Thread) Код:
private void button1_Click(object sender, EventArgs e) Да и пробовал делать так: Код:
private void button1_Click(object sender, EventArgs e) |
Ответ: Многопоточность.
Сорри. Статичность объекта оказалась ни при чем. Однако во время выполнения программы происходит ошибка: попытка доступа к форме созданной не в этом потоке. Как обойти?
|
Ответ: Многопоточность.
У формы (Windows.Forms) как и у любого контрола есть метод Invoke, c помощью которого можно вызвать делегат из основного потока. Достаточно сделать что-то типа form.Invoke(()=>{UpdateForm();});
|
Ответ: Многопоточность.
Цитата:
error CS1660: Не удается преобразовать лямбда-выражение в тип "System.Delegate", так как он не является типом делегата error CS0103: Имя "UpdateForm" отсутствует в текущем контексте |
Ответ: Многопоточность.
Цитата:
PHP код:
PHP код:
|
Ответ: Многопоточность.
Ему все равно не нравится нестатичность формы, и он требует ссылку на нее. Может я не туда вставил предложенный тобой код? ты может поконкретнее указать куда что вставляется. К примеру моя программа сейчас выглядит так:
Код:
private void button1_Click(object sender, EventArgs e) |
Ответ: Многопоточность.
Что такое Mainwindow? Это тоже самое что и this?
|
Ответ: Многопоточность.
Mainwindow это главная форма: та самая на которой происходят изменения.
(Поменял имя с Form1). |
Ответ: Многопоточность.
Т.е. это имя класса, а не ссылка на форму? Поменяй на this и должно заработать.
|
Ответ: Многопоточность.
Супер! Спасибо!
А вот если ты расскажешь как ссылки на объекты делать, то вообще тебе цены не будет! |
Ответ: Многопоточность.
все класыс ссылки) ссылки на типы - ref
|
Ответ: Многопоточность.
Разве ref работает не только ссылка на переменную?
Да и вопрос:"Как передать переменную в поток?" - не снят. |
Ответ: Многопоточность.
|
Ответ: Многопоточность.
Проблема возникает. Если делать отдельным классом то пропадает возможность взаимодействовать с формой.
Решил так: перенес нужную переменную в внешнюю часть класса, что дало возможность обращаться к ней из обеих функций. Но встал один вопрос: Почему когда выполняется второй поток у пользователя нет доступа к форме? Она просто зависает. Я думал потоки для того и нужны, чтобы приложение могло работать в нескольких направлениях одновременно. |
Ответ: Многопоточность.
Ты что-то сделал не правильно.
|
Ответ: Многопоточность.
Так подскажи как правильно. У меня других вариантов нет. Если делать отдельным классом, то из второго класса в класс формы не достучаться без ссылки. Подскажи как ссылку делать на метод/класс и т.д. На тех ресурсах что вы мне давали не раскрывается вопрос решения моей проблемы.
|
Ответ: Многопоточность.
Так что мешает в конструктор "отдельного класса" передать ссылку на форму?
|
Ответ: Многопоточность.
Подскажи как ссылку делать на метод/класс и т.д. На тех ресурсах что вы мне давали не раскрывается вопрос решения моей проблемы. Вот как выглядит моя программа в общих чертах:
Причиной того что окно подвисает во время выполнения скорее всего в том что смысла в моем коде как в куске *****... Скорее всего (я уверен на 70% с небольшим) что метод Invoke вторгается в поток формы, поэтому функция выполняется два раза (первый в фоне, второй после вызова Th в Invoke) и повторно делает вычисления. Бред в том что если делать эту проверку в answer, то я не смогу получить строку на выход. Остается тогда извращаться: добавлять переменную, которая будет регулировать второй вход и пропускать вычисления. |
Ответ: Многопоточность.
И да: весь мой вопрос заключался в том чтобы вы мне рассказали как ссылку на класс сделать!
Ах да, вот: Вспомнил про этот пост и сделал так как ты говорил. Теперь не зависает. Но что если я начну рисовать на панели из другого потока? Мне точно нужно знать как сделать ссылку из дочернего класса в главный. |
Ответ: Многопоточность.
Invoke надо вызывать для обновления интерфейса, а не для выполнения функции с основной задачей, которая должна быть в отдельном потоке. Т.е. всегда когда настал момент обновить интерфейс - вызываешь Invoke с обновлением данных в контролах, все остальное в отдельном потоке. Т.е. основная задача Invoke - записать например текст в метку или что-то подобное.
PS: в коде я ничего не понял и разбираться нет времени. |
Ответ: Многопоточность.
все переменные на классы и есть ссылки если не указано обратного
|
Ответ: Многопоточность.
Ребятки, не кормите help-вампира, пускай сначала язык и платформу освоит.
|
Ответ: Многопоточность.
Цитата:
|
Ответ: Многопоточность.
Цитата:
|
Ответ: Многопоточность.
Цитата:
Но опять же это такое.:) |
Ответ: Многопоточность.
Да нафиг мелочиться, внедряйте сразу MVVM.
Радиокнопка - тролль ) |
Часовой пояс GMT +4, время: 01:50. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot