Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 2
Регистрация: 28.02.2013
Сообщений: 47

Работа с потоками

26.07.2013, 22:31. Показов 979. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Имеется вот такой код. отправка и прием сообщения по указанному IP. пытался сделать так, чтобы отправленное сообщение выводилось одним цветом , а полученное - другим. Меняю свойство ForeColor.

Работает так:
1. первое сообщение и полученное и отправленное: все зеленое
2. потом все красное , зеленый цвет больше не появляется.

Я знаю что не совсем то свойство, но больше беспокоит, что что-то с потоками я не так делаю.

Идеи, советы, критика. Переварю все что напишите.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows;
 
namespace SocketLocalChat
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
            //Создаем поток для приема сообщений
            new Thread(new ThreadStart(Receiver)).Start();
        }
 
        //Метод потока
        protected void Receiver()
        {
            //Создаем Listener на порт "по умолчанию"
            TcpListener Listen = new TcpListener(7000);
            //Начинаем прослушку
            Listen.Start();
            //и заведем заранее сокет
            Socket ReceiveSocket;
            while (true)
            {
                try
                {
                    //Пришло сообщение
                    ReceiveSocket = Listen.AcceptSocket();
                    Byte[] Receive = new Byte[256];
                    //Читать сообщение будем в поток
                    using (MemoryStream MessageR = new MemoryStream())
                    {
                        //Количество считанных байт
                        Int32 ReceivedBytes;
                        do
                        {//Собственно читаем
                            ReceivedBytes = ReceiveSocket.Receive(Receive, Receive.Length, 0);
                            //и записываем в поток
                            MessageR.Write(Receive, 0, ReceivedBytes);
                            //Читаем до тех пор, пока в очереди не останется данных
                        } while (ReceiveSocket.Available > 0);
                        //Добавляем изменения в ChatBox
                        ChatBox.Invoke(new Action<Color>((s) => ChatBox.ForeColor = s), Color.Red);
                        ChatBox.BeginInvoke(AcceptDelegate, new object[] { "Received " + Encoding.Default.GetString(MessageR.ToArray()), ChatBox });
                    }
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
            }
        }
 
        /// <summary>
        /// Отправляет сообщение в потоке на IP, заданный в контроле IP
        /// </summary>
        /// <param name="Message">Передаваемое сообщение</param>
        void ThreadSend(object Message)
        {
            try
            {
                //Проверяем входной объект на соответствие строке
                String MessageText = "";
                if (Message is String)
                    MessageText = Message as String;
                else 
                    throw new Exception("На вход необходимо подавать строку");
            //Создаем сокет, коннектимся
                IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse(IP.Text), 7000);
                Socket Connector = new Socket(EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                Connector.Connect(EndPoint);
                //Отправляем сообщение
                Byte[] SendBytes = Encoding.Default.GetBytes(MessageText);
                Connector.Send(SendBytes);
                Connector.Close();
                //Изменяем поле сообщений (уведомляем, что отправили сообщение)
                ChatBox.Invoke(new Action<Color>((s)=> ChatBox.ForeColor = s), Color.Green);
               ChatBox.BeginInvoke(AcceptDelegate, new object[] {"Send "+MessageText, ChatBox });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
      
        //Делегат доступа к контролам формы
        delegate void SendMsg(String Text, RichTextBox Rtb);
 
        
        
        SendMsg AcceptDelegate = (String Text, RichTextBox Rtb) =>
            {
                Rtb.Text += Text + "\n";     
            };
 
        //Обработчик кнопки
        private void Send_Click(object sender, EventArgs e)
        {
            
            new Thread(new ParameterizedThreadStart(ThreadSend)).Start(Message.Text);
            Message.Clear();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.07.2013, 22:31
Ответы с готовыми решениями:

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

Работа с потоками
Всем доброе время суток. И сразу к проблеме, есть 2 потока которые считывают нажатие клавиш на клавиатуре (в примере это будет ...

Работа с потоками
Здравствуйте! Такой вопрос. Как на выполнение какой либо операции, например на чтение файла веслом 24 гб, выделить 1,2 или 3 потока, и...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2013, 22:31
Помогаю со студенческими работами здесь

Работа с потоками
Помогите начинающему программисту!!! Нужно написать программу в которой есть два дочерних потока. В главном потоке интовой переменной...

Работа с потоками
Объясните мне мои ошибки и как их поправить(грузит ЦП и делает невозможным работу с GUI программы - лагает ужасно) Есть некий класс, в...

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

Работа с потоками
В буфере имеется N записей типа Type. К этим записям на чтение и на запись обращаются m потоков. Каждый из потоков может изменить...

Работа с потоками
Добрый день Можно ли из функции (обычное exe приложение) создать вторичный поток, который будет выполняться при завершении работы этой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru