|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
||||||||||||||||
Событие другого потока (написание клиента на сокетах)07.12.2011, 13:54. Показов 13731. Ответов 23
Метки нет (Все метки)
Добрый день. Мне нужно разобраться с сокетами, точнее - написать клиента на сокетах. Я использую синхронный TCP сокет. В своем приложении я создаю экземпляр класса Client и вызываю метод Start(), который настраивает сокет и запускает Raid() в новом потоке. Raid() - это метод прослушивания порта.
Я знаю про:
Т.е. чтобы второй листинг работал. Подскажите пожалуйста, куда смотреть?
0
|
||||||||||||||||
| 07.12.2011, 13:54 | |
|
Ответы с готовыми решениями:
23
По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались Как из одного потока узнать состояние другого потока Вызывть метод одного потока из другого потока |
|
96 / 96 / 16
Регистрация: 28.01.2008
Сообщений: 426
|
||||||
| 07.12.2011, 14:34 | ||||||
|
а если чуть-чуть поправить
0
|
||||||
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
|||||||
| 07.12.2011, 14:40 [ТС] | |||||||
0
|
|||||||
|
96 / 96 / 16
Регистрация: 28.01.2008
Сообщений: 426
|
|
| 07.12.2011, 15:37 | |
|
antsa, ну если вы читали внимательно справку, то обращение к визуальным компонентам из потоков, отличных от главного, запрещается, и с этим мы ничего не можем сделать.
0
|
|
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
||
| 07.12.2011, 17:27 [ТС] | ||
|
Вопрос в том как передать данные из одного потока в другой?
0
|
||
|
|
|
| 07.12.2011, 18:17 | |
|
Я тоже задавался этим вопросом. И мне тоже интересно, как же сделать, чтобы событие отрабатывало в основном потоке, даже если оно инициировано в другом. Я так понимаю, что к примеру создали мы класс Client в основном потоке программы, а метод уже работает в другом потоке и оттуда инициирует событие и кажись я нашёл что-то по этой теме, но как использовать пока не разобрался. Я как понял этот интерфейс как раз помогает иницировать событие в том потоке, в котором создан объект (ну мы же предполагаем, что Client создан в основном потоке).
ISynchronizeInvoke Не по теме: И не понимаю, зачем у каждого события в начале писать Event? Ведь спутать нереально нисчем и без этого префикса в названии. Не говорю, что у вас также, но вспомнился случай, когда один человек именовал переменные: int iIntegerA; int iIntegerB, double dDoubleSomeVariable; и т.д. Кстати на этом форуме :).
0
|
|
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
||
| 07.12.2011, 18:37 [ТС] | ||
|
Не по теме: Не знаю. Так во всех книгах, я думал это правила хорошего тона для событий. У microsoft еще есть рекомендации как называть делегаты и переменные.
0
|
||
|
|
|||||||
| 07.12.2011, 18:46 | |||||||
|
Вот посмотри внимательно на то, как тут инициируется событие да и вообще на остальные изменения, я думаю это более правильно, хотя если и я где-то что-то не верно сделал, то пишите, если дельный совет будет, то прислушаюсь
(я к тому, что я сам хочу делать правильно, а не типа я такой супер профи, что может быть сам "Я" \m/ прислушаюсь ).
Добавлено через 6 минут
0
|
|||||||
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
||
| 08.12.2011, 05:29 [ТС] | ||
|
Там слева есть "Правила именования": Соглашения о написании прописными буквами Общие соглашения об именовании Имена сборок и библиотек DLL Имена пространств имен. Имена классов, структур и интерфейсов Имена членов типа Имена параметров Имена ресурсов
0
|
||
|
|
||||||||||||||||||||||
| 08.12.2011, 05:58 | ||||||||||||||||||||||
|
Ну вот оттуда же: В именах обработчиков событий (делегатов, используемых как типы событий) используйте суффикс "EventHandler".
Я и назвал в своём примере (правда без Event):
Хотя походу вполне нормально будет написать: ReceiveMessageEventHandler. Можно вообще делегат не объявлять, а так написать:
Кстати, ссылку передавать на инициирующий событие объект, тоже из рекомендаций. Как раз EventHandler<string> передаёт параметр object sender и string Добавлено через 8 минут Короче можно переписать в такой вариант. Но не уверен есть ли острая необходимость оборачивать аргумент в класс, хотя по рекомендациям так надо делать:
0
|
||||||||||||||||||||||
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
|
| 08.12.2011, 06:08 [ТС] | |
|
Меня больше волнует почему не работает. И как вызвать событие из другого потока. Я уже 3 день сижу...
0
|
|
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
||||||
| 08.12.2011, 06:22 | ||||||
|
твоя проблема не в событии а в том что ты обращаешься к визуальным элементам из фонового потока
вот решение
label.Invoke - выпонение делегата в контексте главного потока
0
|
||||||
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
|
| 08.12.2011, 06:30 [ТС] | |
|
Да, это мы знаем. В том то и соль. И хочу передать событие в другой поток. Чтобы потом просто на него подписываться. Сейчас делаю Invoke для своего класса.
0
|
|
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
||
| 08.12.2011, 06:50 | ||
|
зачем писать Invoke для класса???
тебе же русским языком сказано
Выход из ситуации таков... если есть фоновый поток который работает с визуальными элементами то обновлять данные визуального элемента нужно ТОЛЬКО через метод Invoke текущего визуального элемента передавая методу Invoke делегат и параметры делегата для обновления P. S. кстати подписываться можно на любое событие любого класса из любого потока, правда не факт что не будет проблем с синхронизацией
0
|
||
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
|||||||||||||
| 08.12.2011, 09:43 [ТС] | |||||||||||||
|
Нет, Вы меня не поняли. Я знаю что так можно делать. Но дело в том, что мой класс Client будут использовать сторонние разработчики, и хочу предоставить им только один метод SendMessage для отправки сообщения. И одно событие - подписался на него, оно произошло - данные на сокет пришли, ты просто берешь их и пользуешься. Не хочется усложнять им жизнь. хочется что бы выглядело как раз так. Добавлено через 2 часа 47 минут Задача РЕШЕНА!!! С помощью BackgroundWorker.
Частично использованы материалы: backgroundWorker и формы... И да!
0
|
|||||||||||||
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
|
| 08.12.2011, 14:21 | |
|
мда.... месье знает толк в извращениях, мой тебе совет почитай про синхронизацию и пул потоков, асинхронные события тогда может поймешь что для твоей супер - пупер задачи с головой хватит C# 2.0, код решения не стал делать ибо ты все равно не поймешь как он работает
0
|
|
|
215 / 215 / 20
Регистрация: 18.05.2010
Сообщений: 865
|
|||
| 08.12.2011, 14:38 | |||
|
1. что значит передать данные с одного потока в другой? у потока есть данные? может данные с одного экземпляра класса в другой? тут вообще нету проблем, присваивай прямо и все. (за исключением визуальных объектов) 2. а зачем выполнять именно в том потоке? если конечно это не визуальный элемент. можно просто синхронизировать доступ. Я не вижу причин зачем заморачиваться и выполнять все в одном потоке !!! я внимательно читаю тему но что то не доходит до меня зачем такие заморочки.
0
|
|||
|
|
|||||||||||
| 08.12.2011, 20:56 | |||||||||||
1
|
|||||||||||
|
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
|
||||||
| 09.12.2011, 04:09 | ||||||
|
эххх не хотелось особо заморачиватся но раз пошла такая пляска держите
3
|
||||||
|
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
|
||||
| 09.12.2011, 05:23 [ТС] | ||||
|
Спасибо!
0
|
||||
| 09.12.2011, 05:23 | |
|
Помогаю со студенческими работами здесь
20
Управление объектами потока из другого потока Написание прокси сервера на сокетах. Проброс сообщений основному серверу и возврат значений через прокси Написание клиента Написание бота на сокетах: быть или не быть? Написание IRC клиента Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK сделайте это, JDK, то сделайте это по следующей инструкции:
Установка Android SDK, NDK, JDK, CMake и т. д.
Перейдите по ссылке:. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|