Новички всегда отдают дань моде, т.к. подвержены этому со стороны разработчиков IDE. Скачал, начали писать. А что внутри, не всегда бывает интересным.
Новички всегда отдают дань моде, т.к. подвержены этому со стороны разработчиков IDE. Скачал, начали писать. А что внутри, не всегда бывает интересным.
Можете использовать мой код для DX-кластера отсюда: http://ua3gdw.ru/index.php/loggernet-download Там исходники выложены.
Добавлено через 5 минут(ы):
На моём сайте есть и WinForms - контроллы (с исходниками) написанные лично мной в процессе изучения C#.
Последний раз редактировалось UA3GDW; 14.09.2017 в 21:40.
Спасибо от UZ5DM
Спасибо огромное UA3GDW !
UZ5DM, как успехи? Разобрались с моим кодом?
Справедливости ради, пространство имен System.Threading.Tas ks доступно начиная с версии .NET 4.0.
И поддерживается на Windows XP с пакетом обновления 3 (SP3). Так что можно использовать и Task<T>
тоже совместно с async / await. В 4.5 версии просто много чего вкусного добавили и все. Но для простых
вещей врядли пригодится все.
Один момент по коду. За использование BeginInvoke как при вызове из самого контроля, так и у делегата
по-хорошему бьют по рукам. Просто у нас многие программисты не читают доки MSDN, а там абсолютно
четко черным по белому об этом написано, что такое использование нарушает синхронизацию. Если, конечно,
наплевать на отсутствие thread-safe, то вперед. Но в серьезных приложениях так не делают. А правил всего
только 3, цитата из оф. доки:
"This leads to three simple rules:
If you update the control only from the UI thread, use neither InvokeRequired nor Invoke
If you update the control only from a thread other than the UI thread, use only Invoke.
If you update the control from both the UI thread and other threads, use Invoke in combination with InvokeRequired."
И для простоты написания лучше всего поставить себе из гита Reactive Extensions (React .NET) и делать удобные
вещи и не заморачиваться на многие проблемы, так как фреймворк "подумает" за вас. И если уж используются
WinForms, то использовать надо паттерн MVVM, а не тупо апдейтить визуальные контроли из другого потока
делегатом. Старый подход, который уже умер давно. Если говорим о современной версии .NET, то и давайте брать
из нее лучшую практику (best practices), а не изобретать колесо заново.
PS. Стоить заметить, что с использованием .NET Core 2.0 в связке с AvaloniaUI можно писать нативные
приложения, которые по UI выглядят одинаково и на виндах и на линуксе. Про Mono забыли, уже давно
другой подход. И не надо думать о Win32 API.
Да и гораздо проще напиcать тогда уж хелпер:
void UpdateUI(Action action)
{
if (InvokeRequired)
{
Invoke(action);
}
else
{
action();
}
}
и использовать его как:
UpdateUI(() => SampleLabel.Text = "Test");
Спасибо от UZ5DM
На ХР, к сожалению, .NET Core бежать не будет, так как ХР поддерживает только .NET не выше 4.0.
.NET Core поддерживается на следующих версиях: Windows 7 SP1, Windows 8.1, Windows 10, сервера
пропущены за ненадобностью. На линуксе: очень большой список дистрибутивов. На Mac OS X: не
ниже 10.12+.
PS. Ну и такой вопрос возник: а сколько можно поддерживать ХР по времени? Еще 15-20-30 лет? Может
все-таки взять и поставить себе 7-ку, 8-ку? Ну, а может и 10-ку виндов? Холивар на тему, какая из них
лучше и почему? - не хочу разводить. В свое время спорили уже. Скажу только одно: не встречал ни разу
у многих радиолюбителей проблем с 7-кой и 8-кой, и их старым софтом. Проблемы могут быть только
из-за (...) ручек, не более.
Спасибо от UZ5DM
Что б не поднимать новую тему. Вопрос к более опытным товарищам. Столкнулся с такой задачей.
При подключении к telnet-кластеру, каждый выводит свое приглашение, где-то это приглашение выглядит в виде "login", где-то приглашение выглядит как "Please enter your call:"
В библиотеке telnetlib (Python) присутствует метод (read_until) который читает до определенного текста, то есть в первом случае это выглядит как telnetObj.read_until (b"login: "), во втором случае как telnetObj.read_until (b"Please enter your call: "), после получения данного текста в потоке - чтение останавливается и телнет-серверу выталкивается позывной. То есть получается
print (telnetObj.read_unti l (b"Please enter your call: "))
telnetObj.write (call+b"\n")
Но получается решение не универсальное, потому, как может измениться приглашение и тогда перестанет работать этот код.
Сейчас вышел из положения таким образом, что я вообще ничего не читаю, а просто выталкиваю серверу позывной (2 раза, т.к. его просят вводить два раза на всех кластерах, что я пробовал). А после этого уже начинаю читать, все, что сервер присылает и вывожу это. В принципе, такой подход работает, но что-то мне подсказывает что слепое выталкивание позывного не совсем верное решение.
Парсинг строки приглашения исключен, потому как с telnet сервера читаются не строки, а поток байтов. То есть я не могу отловить строку приглашения по какому либо иному признаку, кроме текста.
Собственно вопрос - как правильно выходить из этой ситуации?
Сейчас я тестирую на паре телнет-кластерах - работает. Но вопрос покоя не дает.
Буду благодарен за консультацию
И еще было бы интересно прочесть как парсите получаемые строки, для последующей фильтрации?
Последний раз редактировалось UR4MJK; 03.07.2019 в 15:18.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)