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

Как остановить thread.Sleep по клику

20.06.2014, 07:16. Показов 3938. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
дело такое - опрашиваю ком порты. есть функция и класс, отвечающие за разные методы.
приходится ставить thread.sleep() чтобы получить значение с ком порта, потому что сразу они не приходят.
так вот - все это дело крутится в таймере.
пытаюсь выключить таймер - он мне ругается.
как остановить thread.sleep по клику?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2014, 07:16
Ответы с готовыми решениями:

Thread.Sleep в главном потоке или как сделать нормальную задержку
Здравствуйте, мне нужно сделать задержку, хотелось бы через Thread.Sleep, но использование его в UI-потоке, как известно, приводит к...

Как избежать блокировки основного UI потока при вызове Thread.Sleep в вспомогательном потоке?
Добрый день! Создаю событие для создаваемой кнопки следующим образом: btnStartTool.Click += (sender1, e1) => ...

ProgressBar и Thread.Sleep
Задание: 1 . Создание Windows приложения, которое демонстрирует асинхронную работу в фоновом режиме. Написать метод , выполнение...

30
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
20.06.2014, 07:52
Попробуйте Thread.Abort().
А вообще, думаю есть способ сделать грамотнее и обойтись без Thread.Sleep().

Если скинете код, постараюсь помочь.
0
Заблокирован
20.06.2014, 08:05  [ТС]
не могу я .abort обратиться , равно как и как к interrupt
Ошибка 1 Для нестатического поля, метода или свойства "System.Threading.Thread.Abort()" требуется ссылка на объект E:\proj\ServiceUniOPc\ServiceUniOPc\Serv ice1.cs 613 21 ServiceUniOPc
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.06.2014, 08:08
Цитата Сообщение от SoulMicro Посмотреть сообщение
обойтись без Thread.Sleep().
SoulMicro, бывают моменты, когда без него не обойтись, особенно при работе с портом. Штука тормозная...
А по сути вопроса-выбросить все операции с портом в отдельный поток и работать с портом в потоке.
0
Заблокирован
20.06.2014, 08:20  [ТС]
идея хорошая и видимо правильная но как? у меня там 5 функций, таймер. отдельно еще класс и таймер. сейчас скелет попробую скинуть

Добавлено через 6 минут
вот усеченный вариант но суть ясна
Кликните здесь для просмотра всего текста


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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
namespace ServiceUniOPc
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
           
        }
 
 
        #region tcpconnect
        private void SelectTcp()  //com port
        {
           this.timer1.Start();           
        }
 
 
        private void timer1_Elapsed(object sender, EventArgs e)
        {
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)               
                        Connect(dt.Rows[i][1].ToString(), dt.Rows[i][2].ToString() + "\r", Convert.ToInt32(dt.Rows[i][3]), i);
           
        }
 
        void Connect(String server, String message, Int32 port, Int32 id)
        {
            try
            {
                // Create a TcpClient.
                // Note, for this client to work you need to have a TcpServer 
                // connected to the same address as specified by the server, port
                // combination.
                TcpClient client = new TcpClient(server, port);
 
                // Translate the passed message into ASCII and store it as a Byte array.
                Byte[] data = Encoding.UTF8.GetBytes(message);
                // Get a client stream for reading and writing.
                
 
                NetworkStream stream = client.GetStream();
 
                // Send the message to the connected TcpServer. 
                stream.Write(data, 0, data.Length);
 
            
 
                // Receive the TcpServer.response.
 
                // Buffer to store the response bytes.
                data = new Byte[256];
 
                Thread.Sleep(300);
                
 
                // String to store the response ASCII representation.              
 
                // Read the first batch of the TcpServer response bytes.
                Int32 bytes = stream.Read(data, 0, data.Length);
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
  
                // Close everything.
                stream.Close();
                client.Close();
 
            }
            
        }        
        #endregion 
 
 
        #region comport
        private void SelectCom()  //com port
        {
                        InitAll();        
        }
      
 
 
        private void InitAll()
        {
               allListeners = new List<OneCOMSpectator>();
 
                for (int xx = 0; xx < ds3.Tables[0].Rows.Count; ++xx)
                {
                    string com = "COM" + dt3.Rows[xx][1];
                    string send = dt3.Rows[xx][3].ToString() + "\r";
                    string idcom = dt3.Rows[xx][0].ToString();
                    int BaudRate = Convert.ToInt32(dt3.Rows[xx][2]);
                    string parity = dt3.Rows[xx][10].ToString();
                    int databit = Convert.ToInt32(dt3.Rows[xx][11]);
                    double stopbit = Convert.ToDouble(dt3.Rows[xx][12]);
                    string flowcontrol = dt3.Rows[xx][13].ToString();
                    int timeout = Convert.ToInt32(dt3.Rows[xx][14]);
                    string parseFunc = dt3.Rows[xx][4].ToString();
                    allListeners.Add(new OneCOMSpectator(com, BaudRate, send, idcom, parity, databit, stopbit, flowcontrol, timeout, parseFunc));
                }
                min = Convert.ToInt32(dt3.Rows[0][14]);
                for (int i = 0; i < ds3.Tables[0].Rows.Count; i++)
                {
                    if (Convert.ToInt32(dt3.Rows[i][14]) < min)
                        min = Convert.ToInt32(dt3.Rows[i][14]);
                }
               
                    this.timer3 = new System.Timers.Timer();
                    this.timer3.Enabled = true;
                    this.timer3.Interval = min;
                    this.timer3.Elapsed += new System.Timers.ElapsedEventHandler(this.timer3_Elapsed);
                    this.timer3.AutoReset = true;
                    this.timer3.Start();
         
          
        }
 
        private void timer3_Elapsed(object sender, EventArgs e)
        {
                foreach (OneCOMSpectator comListener in allListeners)
                {
                    comListener.TransferData();
                }
 
        }
 
        class OneCOMSpectator
        {
             
            SerialPort _COM;
            string DataToSend;
            string IdCom;
            string ParseGlob = "";
 
            internal OneCOMSpectator(string portNumber, int bodRate, string dataTosend, string idcom, string parity, int databit, double stopbit, string flowcontrol, int timeout, string parse)
            {
                IdCom = idcom;
                DataToSend = dataTosend;
                _COM = new SerialPort(portNumber, bodRate);
 
                if (parity.ToLower() == "none")
                    _COM.Parity = System.IO.Ports.Parity.None;
                else if (parity.ToLower() == "even")
                    _COM.Parity = System.IO.Ports.Parity.Even;
                else if (parity.ToLower() == "mark")
                    _COM.Parity = System.IO.Ports.Parity.Mark;
                else if (parity.ToLower() == "odd")
                    _COM.Parity = System.IO.Ports.Parity.Odd;
                else if (parity.ToLower() == "space")
                    _COM.Parity = System.IO.Ports.Parity.Space;
 
                _COM.DataBits = databit;
 
                if (stopbit == 0)
                    _COM.StopBits = StopBits.None;
                else if (stopbit == 1)
                    _COM.StopBits = StopBits.One;
                else if (stopbit == 1.5)
                    _COM.StopBits = StopBits.OnePointFive;
                else if (stopbit == 2)
                    _COM.StopBits = StopBits.Two;
 
                if (flowcontrol.ToLower() == "none")
                    _COM.Handshake = Handshake.None;
                else if (flowcontrol.ToLower() == "rts/cts" || flowcontrol.ToLower() == "rts\\cts")
                    _COM.Handshake = Handshake.RequestToSend;
                else if (flowcontrol.ToLower() == "xon/xof" || flowcontrol.ToLower() == "xon\\xof")
                    _COM.Handshake = Handshake.RequestToSendXOnXOff;
                else if (flowcontrol.ToLower() == "dtr/dsr" || flowcontrol.ToLower() == "dtr\\dsr")
                    _COM.Handshake = Handshake.XOnXOff;
 
                _COM.ReadTimeout = timeout;
                _COM.WriteTimeout = timeout;
                if (parse != "")
                    ParseGlob = parse;
 
 
                _COM.DataReceived += new SerialDataReceivedEventHandler(_COM_DataReceived);
 
            }
 
            void _COM_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                    Thread.Sleep(100);
                    // Пришли данные
                    String indata = _COM.ReadExisting();
                    indata = indata.Substring(0, indata.Length - 1);
                    String Mystr = "";
                    // Чето с ними делаем  
 
            }
 
 
            internal void TransferData()
            {
                try
                {
                    if (_COM.IsOpen)
                    {
                        // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем
 
                        // Закрываем
                        _COM.Close();
                    }
 
                    // Открываем
                    _COM.Open();
                    _COM.Write(DataToSend);
                }
                catch 
                {
                    
                    return;
                }
            }
        }    
        #endregion
 
        #region start
        protected override void OnStart(string[] args)
        {
 
                      SelectTcp(); 
              
                    SelectCom();
             
                
           
        }
        #endregion
 
        #region stop
        protected override void OnStop()
        {
                if (this.timer1.Enabled) this.timer1.Stop();
               
                if (this.timer3.Enabled)  this.timer3.Stop();
            
        }
        #endregion
 
    }
}

0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.06.2014, 08:31
DoomUnit, вы лучше общую идею расскажите. Вы открываете все порты и ожидаете приема из них данных, так?
0
Заблокирован
20.06.2014, 08:35  [ТС]
в общем прога получает из базы все что нужно. затем первая функция опрашивает в цикле все порты по tcp. открыла порт - послала значение - подождала 100 мс- записала полученное. вторая функция (посредством класса) - опрашивает реальные ком-порты. так же открыла-послала - подождала 300мс - получила
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.06.2014, 08:38
DoomUnit, по TCP вряд ли подскажу, с ними не работал а по COM попробую набросать вариант с отдельным потоком.
Уточните, порты открываются-прием передача-закрываются по очереди, последовательно? Никакой логики, просто по кругу один за другим?
0
Заблокирован
20.06.2014, 08:40  [ТС]
проблема в том что я сам с потоками не очень (совсем никак)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.06.2014, 08:42
DoomUnit, это не важно, я набросаю класс, надо будет его только применить. Ну так что по логике опроса портов?
И еще, данные, принятые из какого-то порта, должны быть переданы в другую часть приложения?
0
Заблокирован
20.06.2014, 08:48  [ТС]
ну вот я как бы использую класс class OneCOMSpectator в него передаются полученные из базы значения для порта (номер, баудрейт, парити, и прочее). затем проходит опрос всех портов в цикле. полученное значение в этом же цикле загружается в базу постгрес
0
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
20.06.2014, 08:52
insite2012, действительно, тут изобретать что-либо без Sleep() нецелесообразно.

DoomUnit, я следующий фрагмент переписал бы так:

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
private List<Thread> timer1_Threads = new List<Thread>();
 
private void timer1_Elapsed(object sender, EventArgs e)
{
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
    {
        var thread = new Thread(() =>
        {
            Connect(dt.Rows[i][1].ToString(), dt.Rows[i][2].ToString() + "\r", Convert.ToInt32(dt.Rows[i][3]), i);
            timer1_Threads.Remove(Thread.CurrentThread);
        });
        timer1_Threads.Add(thread);
        thread.Start();
    }
}
 
protected override void OnStop()
{
    foreach (var thread in timer1_Threads)
    {
        thread.Abort();
    }
    timer1_Threads.Clear();
 
    if (this.timer1.Enabled) this.timer1.Stop();
}
}

Может кривова-то конечно, но реализована идея insite2012 работать в отдельном потоке с портами.
0
Заблокирован
20.06.2014, 09:05  [ТС]
а заработает? я конечно понимаю все гениальное просто но всеже
0
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
20.06.2014, 09:13
В своих программах я так делал, но подобные вещи все же стараюсь избегать.
Предпочитаю BackgroundWorker завернутый в using - такая конструкция позволяет мне спать спокойней.

Добавлено через 5 минут
Подождите ответа insite2012, он все же более опытный, может его предложение понравится Вам больше.
0
Заблокирован
20.06.2014, 10:01  [ТС]
SoulMicro, че за фигня
почему он мне 2 пишет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
         for (int it = 0; it < ds.Tables[0].Rows.Count; it++)
                {
 
                    var thread = new Thread(() =>
                    {
                        MessageBox.Show(it.ToString());
                        Connect(dt.Rows[it][1].ToString(), dt.Rows[it][2].ToString() + "\r", Convert.ToInt32(dt.Rows[it][3]), it);
                        timer1_Threads.Remove(Thread.CurrentThread);
                    });
                    timer1_Threads.Add(thread);
                    thread.Start();
                }
Добавлено через 3 минуты
и еще - как повторно запустить.?
0
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
20.06.2014, 10:02
Пишет только 2 или после нажатия OK выдает и остальные номера?

Цитата Сообщение от DoomUnit Посмотреть сообщение
и еще - как повторно запустить.?
После Abort() поток повторному запуску не подлежит, необходимо его создать заново и только после этого запускать.
0
Заблокирован
20.06.2014, 10:05  [ТС]
пишет сразу 2. а в позиции 2 у меня данных нет и он падает.

Добавлено через 1 минуту
ds.Tables[0].Rows.Count = 2
0
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
20.06.2014, 10:07
Цитата Сообщение от DoomUnit Посмотреть сообщение
пишет сразу 2. а в позиции 2 у меня данных нет и он падает.
Заверните метод Connect в try ... catch.
В данном алгоритме нет гарантии последовательного перебора строк, т.к. thread.Start() не гарантирует моментального запуска потока (могу ошибаться).
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.06.2014, 10:07
DoomUnit, еще раз спрашиваю: уточните задачу, данные из каждого из портов (те что ответили) должны быть раздельными? Они должны куда-то передаваться?
0
Заблокирован
20.06.2014, 10:08  [ТС]
нет смысл в том что переменной цикла it приравнивается сразу верхняя граница цикла ds.Tables[0].Rows.Count
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2014, 10:08
Помогаю со студенческими работами здесь

Не работает Thread.Sleep();
Не работает задержка. Вернее она работает, но сначала программа делает задержку, а затем отображает текст. if (Data.pin == pin_vvod) ...

Странное поведение Thread.Sleep
Эх, прошу помочь. В общем. Есть поток выполняющий эту функцию: { Begin: CoreInProcessing = true; for...

Thread.Sleep совместно с BeginInvoke
Приветствую уважаемые! Вопрос следующий: имеем данные которые заполняются в потоке, заполнение DataGridView через делегата, чтобы...

Почему при Thread.Abort закрывается программа? Как остановить поток?
Есть класс для инвертирования движения мыши. При вызове метода Stop программа продолжает работать. При применении Abort прога закрывается....

Аналог Thread.Sleep
когда вызываешь функцию Вызываю слип в потоке Thread.Sleep(300000) ТО программа начинает криво работать в чем дело ?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru