Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21

Обращение к методам объектов, созданных в разных потоках

28.10.2013, 01:05. Показов 1037. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гуд дэй, комрэйдс!
Ай хэв э квэштн фор ю!
В общем, у меня есть распоточенное приложение на C# WinForms, вкратце:

классецы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Client
{
  public Client(TcpListener lst)
 {
      //тут не пусто, просто опущено
 }
 
  public string SendMessage(string ms)
  {
      return "blablabla";
  }
}
 
class ClientPanel
{
  
  public Client CLIENT {get; set;}
  
  public ClientPanel(Panel sender, Client client, string cm)
 {
       CLIENT = client;
 }
}
мэйн
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        List<ClientPanel> clientPanelList = new List<ClientPanel>();
        List<Thread> ConnectionThreads = new LIst<Thread>();
        TcpListener ls = TcpListener(IPAddress.Any, PORT);
 
         private void Form1_Load(object sender, EventArgs e)
        {
            ls.Start();
        }
 
       public void ConnectClient()
        {
            Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
            Thread.Start(ls);
            ConnectionThreads.Add(Thread);
        }
 
        private void ClientThread(Object lstnr)
        {
            Client client = new Client((TcpListener)lstnr);
            ClientPanel cp = new ClientPanel(panel1, client, textBox3.Text);
            clientPanelsList.Add(cp);
        }
передача сообщений всем экземплярам класса клиент осущ-ся в цикле
C#
1
2
 foreach( ClientPanel cp in clientPanelsList)
       cp.CLIENT.SendMessage("blabla");
получается, что у меня остальные клиенты по списку ожидают, пока не предыдущий клиент не выполнит задачу. Возникает зависание и прочие неприятности. Думал, может мне создать поток отдельно для обмена сообщениями? и тут мысля - у меня же каждый клиент существует в отдельном потоке - надо только в этом потоке вызвать метод SendMessage...я правильно понял? если ДА - то как мне его вызвать, а если НЕТ - где мои клиенты??)) спасибо за внимание!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2013, 01:05
Ответы с готовыми решениями:

Методы объектов одного класса, находящихся в разных потоках
Есть class Worker : public QObject, в нём - слот process(). Создаётся несколько объектов QThread и несколько объеков Worker. Каждый объект...

Проверка столкновения двух объектов, созданных в разных функциях
Создаю игру. Создал оружие (пулемёт), который при зажатии ЛКМ стреляет, при отжатии перестаёт. Создал рандомное появление монстров....

Можно ли обеспечить взаимодействие программно созданных объектов и объектов, созданных мастером
Здравствуйте. Изучаю C# и ADO.NET и столкнулся с одной серьезной проблемой, которая мешает комфортно программировать. Часто...

2
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
28.10.2013, 11:06
хм... конечно я привык работать с транзакциями типа запрос-ответ, но всегда обрабатывал это немножко иначе: метод на отправку и событие на принятие.

по поводу отправки: не уверен что необходимо возвращаться к тому потоку в котором объект был создан (на самом деле я тупо не знаю сохранен ли он, по моему нет. по крайней мере основным параметром потока является метод, который этот поток выполняет. метод выполнен, чего ещё потоку ждать-то?)

можно попробовать как-то так:
C#
1
2
foreach( ClientPanel cp in clientPanelsList)
       new Thread(cp.CLIENT.SendMessage).Start("blabla");
0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
29.10.2013, 01:40  [ТС]
моя вина, я ошибся в описании:
C#
1
2
foreach( ClientPanel cp in clientPanelsList)
     richTextBox1.AppendText( cp.CLIENT.SendMessage("blabla"));
метод SendMessage возвращает string, Thread не примет его в качестве параметра

Добавлено через 2 часа 2 минуты
а я и не подумал о событиях на ответ! попробую переделать с событиями!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2013, 01:40
Помогаю со студенческими работами здесь

Метод выполнить в 11 разных потоках, соответственно для разных входных массивов
Здравствуйте, начал потихоньку разбираться в многопоточном программирование и не могу до конца разобраться. Допустим есть некий метод в...

Циклы обработки сообщений разных форм в разных потоках
Здравствуйте! Подскажите как реализовать циклы обработки сообщений разных форм в разных потоках. У коде одной формы сделал так: ...

Изменение разных элементов вектора в разных потоках даёт отличный от join() результат, нежели при detach()
Имеется using V = vector&lt;double&gt;; using M = vector&lt;V&gt;; Есть функция матричного умножения A*B. На каждую вектор-строку матрицы A я...

Где и как создать массив объектов, чтобы можно было получить доступ к методам этих объектов?
Задача: &quot;в win form кликаю на кнопку (button) и в этот момент в одном из массивов экземпляров класса должен вызваться метод&quot; ...

Обращение к методам
Здравствуйте. Подскажите, пожалуйста, почему к методу ( или я ошибаюсь) обращаются просто через точку, а не создают экземпляр класса и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru