Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362

Ругается что в другом потоке был создан элемент

25.12.2009, 16:46. Показов 3358. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я пытаюсь сделать чат через сокеты, и использую thread для запуска сервера и клиента, так вот, в триде есть директива, что при получении сообщения, добавлять его в текст бокс, при дебаге у меня ругается что мол в другом триде был создан элемент, поэтому нельзя добавить... а при обычном запуске, все вроде бы нормально, как мне дебажить обходя эту ошибку?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2009, 16:46
Ответы с готовыми решениями:

Обработать процедуру из другого потока и избежать ошибки "элемент управления создан в другом потоке"
Добрый вечер, собственно есть проблема с реализацией второго потока, пишет что элемент управления создан в другом потоке, перечитал кучу...

Не удаляется элемент который был создан на лету
Здравствуйте! Подскажите в чем дело. Не могу удалить стандартным способом элемент, который создал на лету. <button...

Как проверить, что r.Comment еще не был создан?
xl:=CreateOleObject('Excel.Application'); r:=cl.Selection.Areas.Item.Item; //Range - первая ячейка из выделенных Как проверить, что...

16
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
25.12.2009, 17:54
Получается, что вы вызываете элемент, не из того потока в котором он был создан.
или покажите ваш код, или почитайте тут
http://www.rsdn.ru/article/dotnet/CSThreading1.xml
http://www.rsdn.ru/article/dotnet/CSThreading2.xml
скорее всего у вас ошибка из-за проблем области видимости.

ЗІ. Поробуйте вывести текст без дериктив
1
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
25.12.2009, 19:21  [ТС]
код такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void ClientForm_Load(object sender, EventArgs e)
        {
            tr = new Thread(new ThreadStart(StartClient));
            tr.Start();
        }
//......
private void StartClient()
        {
                sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client = new TcpClient();
                client.Connect("127.0.0.1", 2000);
                sock = client.Client;
                cActive = true;
 
                while (cActive)
                {
                    sock.Receive(buffer);
                    chatBox.AppendText(ReadMessage(buffer) + "\n\r");//ReadMessage(buffer) - перевод byte[] в string
 
                }
        }
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
25.12.2009, 19:26
Вам нужно работать с делегатом, а не напрямую с контролом
0
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
25.12.2009, 21:17  [ТС]
а попроще для незнающих?)
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
25.12.2009, 21:23
Перед тем как вызывать объект из другого потока, для него надо создать функцию делегат.
и вызывать этот делегат через Invoke.
Прочитайте то что я вам дал, и вы все поймете, там же есть и примеры.
1
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
02.01.2010, 21:10  [ТС]
я использую делегаты, но всеравно при дебаге выдется ошибка что мол из другого трида нельзя использовать...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public ServerForm()
        {
            InitializeComponent();
            myDelegate = new AddText(AddTextToRTB);
        }
        public delegate void AddText(string text);
        public AddText myDelegate;
        void AddTextToRTB(string text)
        {
            richTextBox1.AppendText(text);
        }
        //метод вызова функции...
        myDelegate.Invoke(message + "\n\r");
и все равно та же ошибка... я чтото делаю не так?
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
06.01.2010, 00:10
Когда-то для подобных целей я написал вот такой класс:
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
public class Log
{
    static string STRING { get; set; }
    static object PARAMETR { get; set; }
    public static RichTextBox richTextBox { get; set; }
 
    public static void Append(string text, object arg0)
    {
        STRING = text;
        PARAMETR = arg0;
        Thread t = new Thread(new ThreadStart(AddText));
        t.Start();
    }
 
    delegate void AddedText(string str);
    
    static void AddText()
    {
        richTextBox.Invoke(new AddedText(PrintText), new object[] { STRING });
    }
 
    static void PrintText(string str)
    {
        richTextBox.AppendText(String.Format(str, PARAMETR));
    }
}
и в основную форму добавте это:
C#
1
Log.richTextBox = richTextBox1;
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
06.01.2010, 00:30
я делаю так
C#
1
2
3
4
5
6
7
8
static class Ex
{
    delegate void SetText(string text);
    public static void SetTextInvoke(this TextBox tb, string text)
    {
        tb.Invoke(new SetText(t => { tb.Text = t; }), text);
    }
}
использовать из любого потока
C#
1
textBox1.SetTextInvoke("111");
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
06.01.2010, 00:36
Ну а если вызов из другого класса?

у меня идет так:
C#
1
Log.Append(а тут как в Console.Write());
Я єто делал дабы заменить Console на какой-то элемент формы
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
06.01.2010, 00:57
Из другого класса тоже работает
1
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
06.01.2010, 01:53  [ТС]
Цитата Сообщение от HIMen Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
static class Ex
{
 delegate void SetText(string text);
 public static void SetTextInvoke(this TextBox tb, string text)
 {
 tb.Invoke(new SetText(t => { tb.Text = t; }), text);
 }
}
а можете объяснить что это означает? это Linq или я чтото путаю? я просто не понял эту часть
C#
1
new SetText(t => { tb.Text = t; })
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
06.01.2010, 11:03
это делегат
0
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
06.01.2010, 12:42  [ТС]
ну я понял чтоэто делегат, я именно конкретно про это
t => { tb.Text = t; }
откуда это, что означает, где почитать можно
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
06.01.2010, 17:02
лямбда-выражение, соответствующее делегату
C#
1
delegate void SetText(string text);
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
06.01.2010, 18:12
Вот тут вроде нормально написано,
http://msdn.microsoft.com/ru-r... 97687.aspx
я тоже никогда не пользовался лямбда-выражениями, прочитал - теперь буду, имхо проще и удобней...
0
 Аватар для Mike
18 / 18 / 2
Регистрация: 20.01.2009
Сообщений: 71
06.01.2010, 21:17
Для доступа к контролу из другого потока, вместо делегатов можно юзать BackgroundWorker
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2010, 21:17
Помогаю со студенческими работами здесь

Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся данные. Причем данных много и процесс занимает длительное...

WPF Как создать элемент в другом потоке
Есть один не основной поток, в нем нужно создать элемент Image. При попытки его создать Image tmp = new Image(); Вылетает ошибка...

Говорит что TextBox в другом потоке чем сама программа. белеберда
Белеберда, данные получает отлично и я их вижу через консоль. а выводить в текстбокс отказывается, public partial class MainWindow:Window...

Как получить значение переменной созданной в потоке, в другом потоке?
Добрый день :) Возник такой вопрос "как получить значение переменной созданной в потоке, в другом потоке?" Не знаю, как правильно...

Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке
Здравствуйте! Я делаю лабу сервер распределенных вычислений в сети. В одном потоке ожидаю клиентов и на каждого клиента создаю поток. ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru