Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 28

Тема: DX cluster and C#

  1. #11
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    Спасибо !!!!!!!!!
    В консоли все "поехало". Alex_m b и RX4HX - огромное спасибо за помощь !!!
    Теперь буду в WinForm реализовывать.
    Очень вам благодарен !

    Добавлено через 47 минут(ы):

    Но в winform не хочет работать.
    Запустил в отельном потоке (Thread) - все равно не идет

    Да и еще вопрос - как корректно закрыть tcpClient ?
    Последний раз редактировалось UZ5DM; 13.09.2017 в 00:43.


  2. #12
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    Интересно сервер кроме одной команды (show) не воспринимает больше
    Пробовал разные - не идет. Это все в консольном варианте. Winform не хочет пока выводить споты

  3. #13

    Регистрация
    15.09.2006
    Адрес
    Харьков
    Сообщений
    446
    Позывной
    ur3les
    Имейте в виду, что из другого потока Вы не сможете перерисовывать данные на главной форме. Используйте делегаты. Перед закрытием клиента закрыть NetworkStream, объединив всё в одном методе, например:
    TcpClient client = null;
    NetworkStream stream;

    public void TcpClientKill()
    {
    if (stream != null)
    stream.Close();

    if(client != null)
    client.Close();

    stream = null;
    client = null;
    }
    И вызывать его, помимо ручного режима, ещё и при закрытии формы внутри
    void OnFormClosed(object sender, FormClosedEventArgs e) {}

  4. Спасибо от UZ5DM

  5. #14
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    VFO спасибо огромное ! Забыл я про делегаты. Все пошло. Сейчас нужно научится давать серверу команды для отображения нужной информации

    Сейчас только одни скимеры выводит - нет спотов посланных операторами
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	screen.png 
Просмотров:	158 
Размер:	53.6 Кб 
ID:	270683  

  6. #15

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    Цитата Сообщение от UZ5DM Посмотреть сообщение
    Да и еще вопрос - как корректно закрыть tcpClient ?
    в приведенном мной примере:
    Код:
    tcpClient.Close();
    Насчет закрытия. Тот пример вообщето говоря не совсем корректен с точки зрения паттерна Dispose.
    Т.к. Stream в данном случае может отдизпозиться несколько раз.
    Но для NetworkStream это не имеет значения, а такая реализация упрощает код - не нужно try/finally городить.

    Насчет WinForms. К контролам, как выше верно указали, можно обращаться только из основного потока.
    Если вы запускаете отдельный поток, то все обращения (даже к свойствам) к контролам нужно синхронизировать.
    Делается это следующим образом. Нужно проверить у любого контрола свойство InvokeRequired и если оно true, то вызвать Invoke или BeginInvoke (последний вариант - асинхронный), передав ему указатель на метод (делегат), который выполнит обращение к контролу.

    Например у вас на форме есть ListBox с именем lbxLog, в который вы хотите добавить строку из отдельного потока.
    Для этого можно в код формы добавить такую функцию (тут this - это форма):
    Код:
            private void AddTextLine(string text)
            {
                if (this.InvokeRequired)
                {
                    this.BeginInvoke(new Action<string>(AddTextLine), text);
                    return;
                }
                lbxLog.Items.Add(text);
            }
    после этого из вашего отдельного потока можно вызвать метод AddTextLine и он безопасно добавит строку в контрол:
    Код:
                    while (tcpClient.Connected)
                    {
                        var line = reader.ReadLine();
                        AddTextLine(line);
                    }
    В данном случае вызов происходит асинхронно - через BeginInvoke.
    Т.е. после вызова AddTextLine управление сразу вернется назад.
    А чуть позже этот метод будет вызван из основного потока, в котором уже можно безопасно обращаться к контролам.

    И таким образом добавление строки в контрол произойдет из основного потока.

    Блокирующий вызов Invoke применять нужно осторожно, т.к. нужно помнить, что если форма будет закрыта, то метод никогда не вызовется из основного потока и вызов Invoke зависнет.
    С BeginInvoke проще, т.к. он не ждет завершения вызова и потому после закрытия формы зависания не произойдет, вызов просто не отработает.


    Для асинхронных операций можно также посмотреть в сторону Task-based асинхронное программирование, в частности async await.
    Это другая концепция, но она доступна только начиная с .NET 4.5. И для начинающих думаю сложновато будет.

  7. Спасибо от UZ5DM

  8. #16
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    Цитата Сообщение от alex_m Посмотреть сообщение
    начиная с .NET 4.5
    VS 2017 - есть поддержка

    Я реализовал так:
    Код:
    ******
    var line = reader.ReadLine();
    str = line;
    this.Invoke(new EventHandler(display_data_event));
    ******
    private void display_data_event(object sender, EventArgs e)
            {
                richTextBox1.AppendText(str+"\n");
            }
    Цитата Сообщение от alex_m Посмотреть сообщение
    начиная с .NET 4.5
    VS 2017 - есть поддержка

    Цитата Сообщение от alex_m Посмотреть сообщение
    Для асинхронных операций можно также посмотреть в сторону Task-based асинхронное программирование, в частности async await
    Буду изучать. Рано или поздно понадобится. Знания никогда не бывают лишними

  9. #17

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    Цитата Сообщение от UZ5DM Посмотреть сообщение
    Сейчас только одни скимеры выводит - нет спотов посланных операторами
    так а что это этот сервер за список выдает?
    И для чего это используется? Для каких-то соревнований?
    Где об этом почитать можно?

  10. #18
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    сервер выдает данные о работе радиолюбительских станций. На какой частоте они работают их скорость (режим телеграфа или цифровых мод) время добавления спота
    Используя эти данные можно например вытащить из строки частоту и передав ее в трансивер - оказаться на частоте данного оператора не крутя ручку валкодера трансивера
    Проведя связь с данным оператором данные заносятся в журнал (электронный). Ну а там уже идет обработка .

    http://www.reversebeacon.net/main.php

  11. Спасибо от alex_m

  12. #19

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    Цитата Сообщение от UZ5DM Посмотреть сообщение
    Я реализовал так:
    Насчет Invoke я выше написал - это опасно.
    В вашем случае совершенно не нужно блокировать поток на время ожидания, пока контрол завершит обновление. Поэтому лучше использовать BeginInvoke.

    И проверку InvokeRequired с BeginInvoke лучше переместить в начало метода.
    Посмотрите мой пример выше.
    В начале метода стоит проверка InvokeRequired, если она срабатывает - это чужой поток и к контролу обращаться нельзя.
    Поэтому происходит BeginInvoke себя и возврат управления.
    Это поставит в очередь вызов метода на исполнение из основного потока.
    И когда метод будет вызван из основного потока, то InvokeRequired будет False, т.е. отработает основное тело метода.

    Цитата Сообщение от UZ5DM Посмотреть сообщение
    VS 2017 - есть поддержка
    я бы не торопился, потому как там нужно очень хорошо понимать что делаешь и что происходит.
    К тому-же .NET 4.5 на WinXP работать не будет. На WinXP максимум .NET 4.0.
    Так что увлечение новыми фичами грозит потерей совместимости.

  13. Спасибо от UZ5DM


  14. #20
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    Наверное модератору нужно переименовать тему в - Разработка на C#
    Это будет правильнее. Тогда можно будет тут общаться по разным вопросам связанным с C#

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Dx cluster
    от ut7du в разделе Правовой практикум радиолюбителя
    Ответов: 3
    Последнее сообщение: 20.08.2012, 12:29
  2. Обезьяны в DX cluster
    от Марат Казей в разделе Для любителей КВ
    Ответов: 9
    Последнее сообщение: 07.11.2009, 10:53
  3. DX-cluster на 144МГц
    от UA3CFM в разделе Для любителей УКВ
    Ответов: 11
    Последнее сообщение: 25.02.2009, 18:43
  4. DX-cluster on air
    от RD3AN в разделе Программное обеспечение
    Ответов: 1
    Последнее сообщение: 08.11.2006, 22:47
  5. DX cluster со спутника и MixW2
    от alex74 в разделе Цифровые виды связи Новые технологии в электронике и связи
    Ответов: 7
    Последнее сообщение: 18.10.2005, 18:44

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •