Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 02.09.2016
Сообщений: 10

Не выводятся сообщения в TextBox

12.06.2017, 00:37. Показов 1524. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Переделываю мессенджер из консольного в приложение с формами. Возникла проблема в выводе сообщений других клиентов.
Они просто не появляются. Скорей всего проблема в этих строках:
C#
1
 Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));receiveThread.Start();
Вот исходный код в консоли:
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
 static void Main(string[] args)
        {   Console.Write("Введите ip адрес сервера: ");
            host = Console.ReadLine();             
            Console.Write("Введите свое имя: ");
            userName = Console.ReadLine();
            client = new TcpClient();
            try
            {
               client.Connect(host, port); //подключение клиента
                stream = client.GetStream(); // получаем поток
 
                string message = userName;
                byte[] data = Encoding.Unicode.GetBytes(message);
                stream.Write(data, 0, data.Length);
 
                // запускаем новый поток для получения данных
                Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
                receiveThread.Start(); //старт потока
                Console.WriteLine("Добро пожаловать, {0}", userName);
                SendMessage();
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                Console.WriteLine("Не удалось подключиться к серверу.");
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
            finally
            {
                Disconnect();
            }
        }
        // отправка сообщений
        static void SendMessage()
        {
            Console.WriteLine("Введите сообщение: ");
 
            while (true)
            {
                Console.Write(userName + " :");
                string message = Console.ReadLine();
                byte[] data = Encoding.Unicode.GetBytes(message);
                stream.Write(data, 0, data.Length);
            }
        }
        // получение сообщений
        static void ReceiveMessage()
        {
            while (true)
            {
                try
                {
                    byte[] data = new byte[64]; // буфер для получаемых данных
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);
 
                    string message = builder.ToString();
                    Console.WriteLine(message);//вывод сообщения
                }
                catch
                {
                    Console.WriteLine("Подключение прервано!"); //соединение было прервано
                    Console.ReadLine();
                    Disconnect();
                }
            }
        }
Вот мною уже переделанный код:
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
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 Form1 = new Form1();            
            Form1.ShowDialog();
            
        }
 
        //Соединение с сервером
 
        public static void ConServ()
        {
            Form1 Form1 = new Form1();
            Form2 Form2 = new Form2();
            client = new TcpClient();
            try
            {
                client.Connect(host, port); //подключение клиента
                stream = client.GetStream(); // получаем поток
 
                string message = userName;
                byte[] data = Encoding.Unicode.GetBytes(message);
                stream.Write(data, 0, data.Length);
 
                 //запускаем новый поток для получения данных
                Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
                receiveThread.Start(); //старт потока 
                
 
            }
            catch (Exception ex)
            {
                Form2.textBox1.Text += "\r\n" + "Не удалось подключиться к серверу.";
                Form2.textBox1.Text += "\r\n" + ex.Message;                
            }
            finally
            {
               // Disconnect();
            }
        }
 
 
        // отправка сообщений
         public static void SendMessage(string message)
        {            
                byte[] data = Encoding.Unicode.GetBytes(message);
                stream.Write(data, 0, data.Length);
          
        }
        // получение сообщений
        static void ReceiveMessage()
        {
            Form2 Form2 = new Form2();
            while (true)
            {
                try
                {
                    byte[] data = new byte[64]; // буфер для получаемых данных
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);
 
                    string message = builder.ToString();
                    Form2.textBox1.Text += message + "\r\n";//вывод сообщения
                    
                }
                catch
                {
                    //Form2.textBox1.Text += "\r\n";
                    //Form2.textBox1.Text += "Подключение прервано!"; //соединение было прервано
                    //Console.ReadLine();
                    //Disconnect();
                }
            }
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2017, 00:37
Ответы с готовыми решениями:

Не выводятся сообщения в блок
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,...

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

Не выводятся сообщения в окно Вывод (Output)
Здравствуйте. Прошу вашей помощи, думаю для людей которые давно работают в VS, это не составит большого труда. Имеется следующая...

6
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
12.06.2017, 10:51
Folman, Вы в каждой функции создаете по экземпляру формы 2. Это не одна и та же форма, а независимые друг от друга объекты. Изменения в одном экземпляре не переносятся в другой. Нужно создать всего один экземпляр формы и работать с ним. Кроме того, у Вас вторая форма только создается, но не отображается.
1
0 / 0 / 0
Регистрация: 02.09.2016
Сообщений: 10
12.06.2017, 21:55  [ТС]
А как мне работать с экземпляром уже созданной формы? Если я не буду дописывать в процедуре Form2 Form2 = new Form2(); то будет выходить ошибка, что мол для нестатического поля, метода или свойства "Form2.textBox1" требуется ссылка на объект. Что-то не до понимаю, как это сделать.
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
12.06.2017, 22:14
Цитата Сообщение от Folman Посмотреть сообщение
А как мне работать с экземпляром уже созданной формы?
Ну уж явно не так как это Вы делаете! Почитайте вот это: Ответы на 7 самых частых вопроса по WinForms. В частности, Вас должен заинтересовать пункт 2.

Добавлено через 2 минуты
UPD. Ну и еще, с учетом того, что Вы планируете работать с формой из другого потока, стоит про Invoke почитать.
2
0 / 0 / 0
Регистрация: 02.09.2016
Сообщений: 10
13.06.2017, 21:51  [ТС]
Shogun31337, сутки пытался что-то с этим сделать, так и не смог. У меня просто в голове не укладывается, как можно обратится к элементу на форме, кроме как по ссылке на него.
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
13.06.2017, 22:51
Folman, Вы прочитали ту статью, ссылку на которую я Вам скинул? Пункт 2 - "Как передать данные из одной формы в другую". Там аж 7 способов реализовано как это можно сделать!!!
А третий пункт как раз про то как обратиться к контролу формы из другого потока! Все что Вам нужно есть в этой статье! Прочитайте и разберитесь!
1
0 / 0 / 0
Регистрация: 02.09.2016
Сообщений: 10
16.06.2017, 15:24  [ТС]
Потратив трое суток на это. Отдав пиво знакомому прогеру, порезав коту щёку лезвием, удалось всё починить.

Вот изменённый класс Program:
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    class Program
    {
        public static string userName;
        public static string host;
        private const int port = 8888;
        static TcpClient client;
        public static NetworkStream stream;
        public static Boolean ExitApp = true;
        public static Form1 loginForm;
        public static Form2 chatForm;
 
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            loginForm = new Form1();
            chatForm = new Form2();
            loginForm.ShowDialog();
           
        }
 
        //Соединение с сервером
 
        public static void ConServ()
        {
            client = new TcpClient();
            try
            {
                client.Connect(host, port); //подключение клиента
                stream = client.GetStream(); // получаем поток
 
                string message = userName;
                byte[] data = Encoding.Unicode.GetBytes(message);
                stream.Write(data, 0, data.Length);
 
                 //запускаем новый поток для получения данных
                Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
                receiveThread.Start();//старт потока 
                receiveThread.IsBackground = true;
 
 
            }
            catch (Exception ex)
            {
                
                chatForm.textBox1.Text += "Не удалось подключиться к серверу.";
                chatForm.textBox1.Text += "\r\n" + ex.Message + "\r\n";               
 
                if (MessageBox.Show("Хотите снова соединиться с сервером?", "Ошибка подключения к серверу", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    ExitApp = false;
                    Application.Restart();
                }
                else
                {
                    Disconnect();
                }
            }
            
        }
 
 
        // отправка сообщений
         public static void SendMessage(string message)
        {
            stream = client.GetStream();
            byte[] data = Encoding.Unicode.GetBytes(message);
            stream.Write(data, 0, data.Length);           
            
 
        }
        // получение сообщений
        static void ReceiveMessage()
        {
            Boolean error = true;
            while(error == true) {
                try
                {
                    byte[] data = new byte[64]; // буфер для получаемых данных
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);
 
                    string message = builder.ToString();
                    chatForm.textBox1.Invoke(new Form2.Form2Text1((s) => chatForm.SetTextSafeForm2Text1(s + "\r\n")), message);
                    
                }
                catch
                {
                    chatForm.textBox1.Invoke(new Form2.Form2Text1((s) => chatForm.SetTextSafeForm2Text1(s + "\r\n")), "\r\n" + "Подключение прервано!");
                    //chatForm.textBox1.Text += "\r\n";
                    //chatForm.textBox1.Text += "Подключение прервано!"; //соединение было прервано                    
                    //Disconnect();
                    error = false;
                    if (MessageBox.Show("Хотите снова соединиться с сервером?", "Ошибка соединения", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        ExitApp = false;
                        Application.Restart();                        
                    }
                    else
                    {
                        Disconnect();
                    }
                        
 
                }
            }
        }
 
        public static void Disconnect()
        {
            
            //if (stream != null)
            // stream.Close(); //отключение потока
            //if (client != null)
            // client.Close(); //отключение клиента
            //завершение процесса
 
            Environment.Exit(0);
        }
    }
}
И то что нужно было добавить в обработчик формы:
C#
1
2
3
4
5
6
7
 public delegate void Form2Text1(string text);
 public void SetTextSafeForm2Text1(string newText)
        {
            if (textBox1.InvokeRequired) textBox1.Invoke(new Action<string>((s) => textBox1.Text += s), newText);
            else textBox1.Text += newText;
            textBox1.SelectionStart = textBox1.Text.Length;
            textBox1.ScrollToCaret();}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2017, 15:24
Помогаю со студенческими работами здесь

Сообщения 404 выводятся только в консоль
программа достает из http запроса название файла и выводит его содержимое в браузер содержимое файла в браузере выводится правильно,...

Выводятся непонятные сообщения в процессе выполнения программы
Всем доброго дня ! Подскажите пожалуйста , почему при выводе строки (160) cout&lt;&lt;&quot;\n*******...

После смены директивы сегментации на сокращенную не выводятся сообщения на экран
ё.486 .model small data segment msgDone db &quot;Press any key to continue...$&quot; msgCount db &quot;Count of numbers: $&quot; msgWait1 db...

В textbox не выводятся данные
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Написать прогу, которая выводит сообщение в телеграфном стиле: буквы сообщения выводятся с задержкой.
Написать прогу, которая выводит сообщение в телеграфном стиле: буквы сообщения выводятся с задержкой. Помогите... Добавлено через 37...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru