Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
11 / 11 / 3
Регистрация: 29.12.2010
Сообщений: 50
1

Остановка потока

14.08.2011, 23:25. Показов 2046. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые программисты, прошу помощи, ибо не нашел логического объяснения своей проблеме.
В моей программе создан класс - "клиент", который должен работать следующим образом:

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

в главном теле программы создается экземпляр клиента, запускается принятие данных
и далее программа ждет получения "нужного" пакета (тоже бесконечный цикл)

но, по не понятной мне причине поток чтения данных останавливается не отработав до конца,
причем именно останавливается, а не зацикливается например

смотрел отладчиком по шагам, код выполняется, до отмеченного ниже места (98 строка), затем выполнение передается в главное тело программы и больше не возвращается

подскажите пожалуйста, в чем может быть проблема, пол дня пытался найти ошибку...

Класс - "клиент":
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
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;
 
namespace ClientClassNames
{
    class ClientClass
    {
        public class PacketClass
        {
            public string Head;     //Заголовок пакета
            public int ID;      //Идентификатор отправителя
 
            //Буфферы данных различных типов
            public List<int> bufInt = new List<int>();
            public List<float> bufFloat = new List<float>();
            public List<double> bufDouble = new List<double>();
            public List<string> bufString = new List<string>();
        }
        private TcpClient client;
        private NetworkStream NWS;
        private int last = 0;
 
        public BinaryReader R;      //поток для принятия данных
        public BinaryWriter W;      //поток для отправки данных
        public int port;
        public string adres;
        public int kol;             //Количество принятых пакетов
        public bool Connected;      //Статус подключения        
 
        public List<PacketClass> packet = new List<PacketClass>();      //Список пакетов
        
        public ClientClass()        //конструктор класса
        {
            port = 49200;
            adres = "127.0.0.1";
            kol = 0;
            Connected = false;
        }
 
        public ClientClass(string destAdresss, int destPort)        //конструктор класса
        {
            port = destPort;
            adres = destAdresss;
            kol = 0;
            Connected = false;
        }
 
        public void Connect()
        {
            //создадим сокетное подключение для общения с сервером
            client = new TcpClient(adres, port); //IP адрес сервера и порт на котором он висит
            NWS = client.GetStream();
            R = new BinaryReader(NWS); //поток для принятия данных
            W = new BinaryWriter(NWS); //поток для отправки данных
 
            Thread reading = new Thread(new ThreadStart(readStream));      //Запуск потока чтения данных      
            reading.Start();            
            
        }
 
        private void readStream()       //Поток чтения данных
        {
            Connected = true;
            bool conOpened = true;
            while (conOpened)       //Бесконечный цикл чтения, пока откыто подключение
            {                
                string strBuf = R.ReadString();                  //Заголовок пакета
 
                switch (strBuf)
                {
                    case "Pos":
                        packet.Add(new PacketClass());
                        last = packet.Count - 1;
                        packet[last].Head = strBuf;
                        packet[last].ID = R.ReadInt32();
                        packet[last].bufDouble.Add(R.ReadDouble());
                        packet[last].bufDouble.Add(R.ReadDouble());
                        kol++;
                        break;
 
                    case "You":
                        packet.Add(new PacketClass());
                        last = packet.Count - 1;
                        packet[last].Head = strBuf;                     //Имя заголовка пакета
                        packet[last].ID = R.ReadInt32();                //Чтение идентификатора отправителя
                        packet[last].bufInt.Add(R.ReadInt32());         //Чтение количества игроков
                        for (int i = 0; i < packet[last].bufInt[0]; i++)
                        {
                            packet[last].bufInt.Add(R.ReadInt32());      //Добавление ID игрока в буффер пакета
                        }
                        // <======================= дальше код не отрабатывается
                        kol++;      //Увеличение количества принятых пакетов
                        break;
                }
 
            }
        }
 
    }
}
Отрывок кода из основного тела программы:

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
                   //........................
                   client = new ClientClass("127.0.0.1", 49200);
                   client.Connect();
                   Con.Write("Connecting...");      //Вывод в игровую консоль
                   while (!client.Connected) { }
                   Con.Write("Client connected.");
 
                   client.W.Write("Who");           //Запрос на получение: своего ID, кол. игроков и их ID к серверу
                   client.W.Write("Player");        //Отправка своего имени серверу
                   bool IDpoluchen = false;
                   while (!IDpoluchen)        // <--------Этот цикл виснет, так как количество пакетов не прибавляется
                   {
                       for (int i = 0; i < client.kol; i++)
                       {
                           if (client.packet[i].Head == "You")
                           {
                               igrok[0].ID = client.packet[i].ID;           //получение своего ID
                               kolIgrokov = client.packet[i].bufInt[0];         //получение количества игроков
                               for (int n = 0; n < kolIgrokov; n++)
                               {
                                   igrok.Add(new Player());         //создание игрока
                                   igrok[igrok.Count - 1].ID = client.packet[i].bufInt[n + 1];        //получение ID игрока
                               }
                               IDpoluchen = true;
                               Con.Write("ID: " + igrok[0].ID);
                           }
                       }
                   }
                   //..........................
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2011, 23:25
Ответы с готовыми решениями:

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например,...

Остановка служб
у меня вопрос как написать код чтобы программа останавливала службы если такой службы в списке нет ...

Остановка Socket.Listen
Пишу приложение клиент-сервер. Так вот нужно, что бы при нажатии на кнопку (в сервере),...

Остановка бесконечного цикла
Всем привет, как остановить бесконечный цикл через условие? bool control = false; ...

1
11 / 11 / 3
Регистрация: 29.12.2010
Сообщений: 50
16.08.2011, 10:23  [ТС] 2
Всем спасибо за участие, проблема решена.
Нужно было... выспаться. Ошибка закралась в код сервера.
0
16.08.2011, 10:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2011, 10:23
Помогаю со студенческими работами здесь

Принудительная остановка таймера
Здравствуйте! Ситуация следующая, у моей программы триал версия, но обойти ее очень просто т.к. при...

Не получается с вторичного потока обратиться напрямую к объекту из главного потока
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к...

Остановка анимации
Здраствуйте, помогите пожалуйста с решением следующей проблемы: Существует множество динамически...

Остановка загрузки изображений
Доброго времени суток, есть такая проблема, получается я загружаю большое количество картинок из...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru