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

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

20.06.2014, 07:16. Показов 3991. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru