c форма в отдельном потоке

Многопоточность в C#: как работать с потоками в C# и как в потоке обращаться к элементам формы

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

Как работать с потоками в C#

После изучения данной темы, проб и ошибок, упрощения и написания кода всё оказалось достаточно просто. Сейчас постараюсь простыми словами объяснить, как запустить задачу в отдельном потоке.

Далее у нас есть некая функция 1 (func1) в которой выполняется некий код и в середине этого кода у нас есть кусок кода, который мы хотим выполнить в отдельном потоке. Для этого нам необходимо написать дополнительную функция 2 (func2), в которую вынести весь код, который мы будем запускать в отдельном потоке. После этого в нужном месте функции 1 нам надо вызвать отдельный поток и продолжить выполнение кода, в то время, когда в отдельном потоке параллельно будет выполняться другой код. Теперь всё вышесказанное мы опишем кодом.

Функции привёл в обратном порядке, чтобы далее прокомментировать функцию 1. Сначала у нас выполняется некий «КОД 1» после этого мы запускаем первый поток и сразу продолжаем выполнять «КОД 2», потом доходим до запуска второго потока и его запускаем и сразу переходим к выполнению следующего кода «КОД 3». В итоге у нас два потока выполняют код из функций «func2» и «func3» одновременно с выполнением кода основной функции «func1».

В данном примере у нас после выполнения «КОД 3» происходит выход из функции 1 при этом потоки продолжают свою работу пока не выполнится весь вызываемый ими код. Есть способ, который позволяет при завершении главной функции, которая запустила потоки, сразу завершать и выполнение потоков, для этого добавляем потоку параметр «IsBackground = true»:

Теперь у нас поток будет завершён сразу после выполнения «КОД 2».

Если вы хотите узнать в каком состоянии сейчас находится запущенный вами поток, то вам необходимо получить его статус «potok1.ThreadState». Подробное описание статусов можете просмотреть на сайте Microsoft.

Как в отдельном потоке в C# обращаться к элементам формы

Если вы запустили отдельный поток, то вы не сможете из этого потока обращаться к элементам формы напрямую, так как вам будет выдаваться ошибка мол вы обращаетесь к элементам, которые были созданы в другом потоке. Эта ситуация поправима, и мы сейчас рассмотрим решение.

Обратите внимание, где он объявляется.

Теперь создадим функцию, в которой будем изменять требуемый нам элемент:

Теперь в коде отдельного потока мы с вами изменим элемент обратившись к функции изменяющий требуемый элемент:

А что делать если нам надо изменить элемент передав в него какое-то значение? Для этого объявляем «MyDelegate» с переменной:

И создаём функцию, в которой будем изменять требуемый нам элемент, с такой же переменной.

Теперь в коде отдельного потока изменим элемент обратившись к функции изменяющий требуемый элемент и передав требуемое нами значение:

Основа заложена, а дальше уже остаётся самостоятельно постигать глубинный смысл потоков ?

Источник

Создание новой формы в потоке.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

создание новой формы
доброго времени суток не закидывайте помидорами, но я правда не нашла как это сделать надо.

Задержка потока. Вызов новой формы в потоке
Небольшое описание: Я делаю тренировочное приложение в котором видятся учёт всех сотрудников.

Создание формы в потоке
Доброго времени суток. Столкнулся с проблемой: имеется поток в котором идет обработка некого файла.

tickСоздание формы в главном потоке программы
Доброго времени суток, есть необходимость нарисовать форму для управления некоторыми действиями в.

Чего это она вдруг будет зависшая?

Но я не знаю почему. Ранше зависшую выводило сейчас вообше никакую не выводит.

Добавлено через 11 минут
Ну код вот так идёт. Но ничё не работает кто то может помочь?

Создание новой формы
Здравствуйте, у меня проблема. Я пытаюсь создать вторую форму, и показать её после нажатия кнопки.

tickСоздание новой формы
В с# новичек поэтому громко не ругатся=) Подскажите пождалуйста как создать новую форму. В.

Создание новой формы из потока
Здравствуйте форумчане! Занимаюсь программированием недавно. Стоит VS 2010 express. Пишу.

TcpListener не допускает создание новой формы
Здравствуйте! Может мне кто-нибудь подскажет, выход из следующей ситуации. есть форма, мне нужно.

Создание новой формы и наследование информации из метки
Здравствуйте! использую VB 2008 Express edition Помогите пожалуйста с таким вопросом, есть список.

Источник

Конструктору этого класса необходимо передать имя функции возвращающей void, которая собственно и будет вызываться в параллельном потоке. После чего мы запускаем наш поток методом Start() определенном внутри вновь созданного потока.

Итак, главный и второстепенный поток параллельно выполняют почти идентичный код они считают до 9 (как повелось, с нуля), перед этим назвав собственный номер. Обратите внимание на статический метод Thread.Sleep(0). Он приостанавливает поток вызвавший его на количество миллисекунд указанных в параметре. Но в данном случае ему передан параметр 0. Это означает что поток должен приостановиться для того чтобы дать возможность выполнения другому потоку.

И для того чтобы консоль не закрылась раньше времени, мы будем ожидать ввода с клавиатуры (Console.Read).В результате ваша программа выведет в консоль примерно следующее:
Поток 1 выводит 0
Поток 2 выводит 0
Поток 1 выводит 1
Поток 1 выводит 2
Поток 1 выводит 3
Поток 2 выводит 1
и т.д.

Хотя результат вывода каждый раз будет разным. Это зависит от множества факторов.Стоит принять во внимание, что потоки бывают двух видов: приоритетные и фоновые. Фоновые потоки автоматически завершаются при завершении приоритетных. По умолчанию в приоритетном потоке запускается функция Main а остальные потоки создаются фоновыми. Именно поэтому мы должны следить за тем, чтобы главный поток не завершился до окончания производных. Для того чтобы не допустить этого мы можем использовать поле IsAlive, которое возвращает true если поток активен. Либо метод Join(), который заставляет поток в котором он вызван ожидать завершения работы потока которому он принадлежит.

Однако мы можем и сами менять виды потоков. Свойство потока IsBackground определяет является ли поток фоновым. Таким образом, мы можем сделать поток приоритетным. myThread.IsBackground = false; Однако, нам необязательно создавать новый поток внутри метода Main. Давайте создадим класс который будет открывать новый поток в собственном конструкторе. Созданный нами класс по-прежнему будет заниматься счетом, но на этот раз он будет считать до указанного числа, за счет передачи потоку параметров.

Разберем данный пример. Конструктор нашего класса myThread принимает 2 параметра: строку, в которой мы определяем имя потока, и номер до которого будет вестись счет в цикле. В конструкторе мы создаем поток, связанный с функцией func данного объекта. Далее мы присваиваем нашему потоку имя, используя поле Name созданного потока. И запускаем наш поток, передав функции Start аргумент.

Обратите внимание на то, что функция вызываемая потоком может принимать только 1 аргумент, и только типа object. В функции func цикл for досчитывает до числа, переданного ему как аргумент, и поток завершается. В функции Main мы создаем 3 пробных объекта, работа которых выведет на консоль примерно следующий текст.

Thread 1 выводит 0
Thread 1 выводит 1
Thread 2 выводит 0
Thread 2 выводит 1
Thread 2 выводит 2
Thread 2 завершился

На этом примере я хочу закончить свою статью. И хотя много средств работы с потоками остались незатронутыми мной, я смею надеяться что информация представленная мной будет полезной.

Источник

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Потоки в C# для начинающих: разбор, реализация, примеры

В данной статье мы расскажем, что такое потоки в C#, приоритеты потоков и их типы, покажем, как работать с потоками и как ими управлять, создадим несколько наглядных примеров, объясняющих их работу.

Что такое потоки в C#

Если говорить простым языком, то поток – это некая независимая последовательность инструкций для выполнения того или иного действия в программе. В одном конкретном потоке выполняется одна конкретная последовательность действий.
Совокупность таких потоков, выполняемых в программе параллельно называется многопоточностью программы.

Следует также запомнить, что в действительности потоки выполняются всё-таки не совсем параллельно. Дело в том, что процессор физически не может обрабатывать параллельно несколько инструкций или процессов. Однако его вычислительной мощи хватает настолько, что он может выполнять все операции по небольшому фрагменту по очереди, отводя на каждый такой фрагмент по очень маленькому кусочку времени, настолько, что кажется, будто все процессы в компьютере выполняются параллельно.

Точно такая же ситуация происходит и с потоками. Если в программе имеется 3 потока, то сначала выполняется кусочек кода из одного потока, потом кусочек кода из другого, затем – из третьего, после чего процессор снова переходит к какому-либо из двух других потоков. Выбор, какой поток необходимо назначить для выполнения в данный момент остаётся за процессором. Происходит это в доли миллисекунд, поэтому происходит ощущение параллельной работы потоков.

Стандартно в проектах Visual Studio существует только один основной поток – в методе Main. Всё, что в нём выполняется – выполняется последовательно строка за строкой. Но при необходимости можно “распараллелить” выполняемые процессы при помощи потоков.

Для лучшего осознания можно представить следующий пример. Допустим, что наша программа и данные, которые в ней содержатся – это офис с различными предметами (папками, столами, стульями, ручками), а потоки – это работники данного офиса (изначально у нас только один работник, выполняющий всю работу), и каждый работник занимается теми делами, которые ему было сказано выполнять. Работники могут выполнять одинаковые задания, а могут и различные. В случае выполнения какой-либо одной задачи, несколько работников справятся быстрее, чем один.

Например, если один работник будет собирать шкаф час, то вдвоём они могут управиться уже за полчаса. Однако не стоит переусердствовать в количестве работников (потоков). Математически, если нанять 4 работника, то шкаф соберется за 15 минут, если нанять 60 работников – за 1 минуту, а если нанять 3600, то вообще за секунду, но ведь на деле это неверно. Работники будут только мешать друг другу, толкаться, отнимать друг у друга детали, и процесс сборки шкафа может затянуться очень надолго.

Так же и с потоками. Чем больше потоков, тем выше вероятность, что они будут мешать друг другу выполнять свою работу. Например, если заставить работать огромное количество потоков с одними и теми же данными, потокам придётся выстраиваться в очередь для их обработки (например, если тем же 3600 рабочим дать какое-либо письменное задание, но предоставить им для этого дела всего одну ручку, то работникам, естественно, придётся становиться друг за другом в очередь за ручкой, чтобы после её получения выполнить поставленную задачу. Времени это займёт довольно много).

Итог: потоки надо распределять с умом и исключительно в случаях, когда это действительно необходимо для ускорения работы программы либо для повышения производительности.

Язык C# имеет встроенную поддержку многопоточности, а среда .NET Framework предоставляет сразу несколько классов для работы с потоками, что в купе очень помогает гибко и правильно реализовывать и настраивать многопоточность в проектах.

В среде .NET Framework существует два типа потоков: основной и фоновый (вспомогательный). В целом отличие между ними одно – если первым завершится основной поток, то фоновые потоки в его процессе будут также принудительно остановлены, если же первым завершится фоновый поток, то это не повлияет на остановку основного потока – тот будет продолжать функционировать до тех пор, пока не выполнит всю работу и самостоятельно не остановится. Обычно при создании потока ему по-умолчанию присваивается основной тип. О том, как узнать, к какой разновидности относится тот или иной поток, как придать потоку нужный тип, что такое приоритеты и как их устанавливать, и как в целом работать с потоками в C# мы поговорим ниже.

Реализация потоков в C#

Как создавать потоки в C#

Перво-наперво для работы с потоками в C# необходимо подключить специальную директиву:

Источник

Не получается создать форму в отдельном потоке

Помогите, пожалуйста, исправить. Если нужно будет посмотреть весь проект целиком- скину.
Вот собственно, код вызова формы.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

В отдельном потоке создать дочернюю форму, которую можно было бы активировать когда главная форма занята
Дано: Основная форма, длительный рассчёт. Задача: показать progressbar, но хочу показать его на.

tickПоказать форму в отдельном потоке (многоразово)
Доброе всем. Помогите разобраться, совсем запутался. Есть: Form1, на ней 3 кнопки.

Как запустить форму в отдельном потоке
Как запустить форму в отдельный поток.

Вложения

zip сканер.zip (55.1 Кб, 1 просмотров)

Решение

Добавлено через 16 минут
вообще, если вы хотите, чтобы прям как вашем проекте работало, то все равно нужно метод Scanner(); запускать в отдельном потоке.
А так он запускается в потоке первой (главной) формы, и пока метод Scanner(); работает, код в программе дальше не выполняется. По идее, после того, как Scanner(); отработал, должна запуститься и вторая форма.

Вообще можно попробовать сначала запустить вторую форму, а уже потом начать сканирование.

Если Вас не затруднит, могли бы вы посмотреть сам проект. Я определенно что-то делаю неправильно, хотя вроде всё по инструкции?

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • c форма без заголовка
  • c учетом результатов участия в маркетинговых акциях