Загрузка...

Задача на потоки C#

Тема в разделе C# создана пользователем chavarria 2 дек 2022. 282 просмотра

  1. chavarria
    chavarria Автор темы 2 дек 2022 </> Python разработка - /threads/6461606 522 17 мар 2018
    Первый поток считывает данные из текстового файла. Если считается число, оно передается во 2-й поток, если слово – в 3-й. Второй поток находит максимум и минимум получаемых чисел и выводит эти данные на экран. Третий поток находит слово с максимальным количеством гласных букв и выводит его на экран.
     
  2. vtlstolyarov
    vtlstolyarov 3 дек 2022 468 8 янв 2022
    chavarria, Под "потоком" имеется в виду thread или task? В какой момент времени потоки выводят инфу на экран - после обработки каждого нового значения или в конце после того как весь файл прочитан? есть код который ты набросал но в нем что-то не работает или ты хочешь чтобы тебе всё написали?
     
    1. Посмотреть предыдущие комментарии (19)
    2. chavarria Автор темы
      vtlstolyarov, я просто в кнопку его вставил
      C#
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      using System.IO;
      using static System.Net.Mime.MediaTypeNames;
      using static System.Windows.Forms.VisualStyles.VisualStyleElement;
      using System.Runtime.Remoting.Channels;
      using System.Threading;
      using System.Threading.Channels;

      namespace pzos_lab5
      {
      public partial class Form1 : Form
      {
      public Form1()
      {
      InitializeComponent();
      }

      private void button1_Click(object sender, EventArgs e)
      {
      string filePath = "test.txt";
      if (File.Exists(filePath))
      {
      var channelOption = new UnboundedChannelOptions() { SingleReader = false, SingleWriter = true };
      var numberChannel = Channel.CreateUnbounded<int>(channelOption);
      var wordChannel = Channel.CreateUnbounded<string>(channelOption);

      async Task ReadAndPublish()
      {
      string text = File.ReadAllText(filePath);
      foreach (var word in text.Split(' '))
      {
      if (int.TryParse(word, out var number))
      {
      await numberChannel.Writer.WriteAsync(number);
      }
      else
      {
      await wordChannel.Writer.WriteAsync(word);
      }
      }

      numberChannel.Writer.TryComplete();
      wordChannel.Writer.TryComplete();
      }

      async Task ConsumeNumbers()
      {
      int min = int.MaxValue;
      int max = int.MinValue;
      while (await numberChannel.Reader.WaitToReadAsync())
      {
      while (numberChannel.Reader.TryRead(out var number))
      {
      if (number < min)
      {
      min = number;
      textBox3.Text = Convert.ToString(min);
      }

      if (number > max)
      {
      max = number;
      textBox4.Text = Convert.ToString(max);
      }
      }
      }
      }

      async Task ConsumeWords()
      {
      while (await wordChannel.Reader.WaitToReadAsync())
      {
      int maxLength = 0;
      while (wordChannel.Reader.TryRead(out var word))
      {
      if (word.Length > maxLength)
      {
      maxLength = word.Length;
      textBox1.Text = word;
      }
      }
      }
      }

      var consumers = new[]
      {
      new Thread(ConsumeNumbers().Wait),
      new Thread(ConsumeWords().Wait),
      new Thread(ReadAndPublish().Wait),
      };

      foreach (var consumer in consumers)
      {
      consumer.Start();
      }

      foreach (var consumer in consumers)
      {
      consumer.Join();
      }
      }
      else
      {
      textBox1.Text = "Файл не найден";
      }
      }
      }
      }
    3. vtlstolyarov
      chavarria, нет, чел - ты не просто его в кнопку вставил, ты пытаешься обновить значения в элементах формы не из UI потока - это так просто не работает, надо обновлять через Invoke, как-то так
      textBox1.Invoke((MethodInvoker)delegate { textBox1.Text = word; });


      ну и поля для min и max так же
    4. chavarria Автор темы
      vtlstolyarov, проблема не в этом, даже если я вообще вывод убираю, то программа так же намертво зависает при нажатии на кнопку
    5. Посмотреть следующие комментарии (3)
Top
Загрузка...