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

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

20.06.2014, 07:16. Показов 4124. Ответов 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, 10:10
Цитата Сообщение от DoomUnit Посмотреть сообщение
ds.Tables[0].Rows.Count = 2
Понятно!

Добавьте перед созданием потока строку:

C#
1
 var buf_it = it;
И вместо it используйте buf_it в потоке.

Я предполагаю, что дело в том, что к моменту запуска потока переменная цикла it уже достигает значения 2. Следовательно, необходимо зафиксировать значение it в переменную buf_it и использовать зафиксированное значение.
0
Заблокирован
20.06.2014, 10:29  [ТС]
вот так сработало
C#
1
2
3
4
5
6
7
8
9
10
 for (int it = 0; it < ds.Tables[0].Rows.Count; it++)
                {
                    Int32 i = it;
                    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();
Добавлено через 47 секунд
не видя вашего поста сам догадался)))

Добавлено через 1 минуту
может и с ком портом подскажешь как сделать?

Добавлено через 52 секунды
там вот такое
C#
1
2
3
4
5
6
7
8
 private void timer3_Tick(object sender, EventArgs e)
        {
            foreach (OneCOMSpectator comListener in allListeners)
            {
                comListener.TransferData();
            }
               
        }
Добавлено через 9 минут
рано радовался
Failed to stop service. System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperation Exception(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumer ator.MoveNextRare()
at System.Collections.Generic.List`1.Enumer ator.MoveNext()
at ServiceUniOPc.Service1.OnStop()
at System.ServiceProcess.ServiceBase.Deferr edStop()
0
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
20.06.2014, 10:37
Цитата Сообщение от DoomUnit Посмотреть сообщение
рано радовался
Метод OnStop() вызывается до того как все потоки успели завершиться.
В процессе перебора коллекции циклом foreach нельзя ее менять, однако один из потоков пытается удалить себя из коллекции запущенных потоков.

Можно изменить цикл foreach на for и пробегать коллекцию потоков с конца с использованием try ... catch, но это приведет к завершению нормально работающих потоков.
Тут необходимо задержать вызов метода OnStop(), либо в самом методе предусмотреть вариант изменения коллекции потоков.

Дальнейшие модификации программы приведут к ее чрезмерному усложнению. Я бы посмотрел что ответит insite2012, мне кажется он предложит что-то более дельное.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.06.2014, 11:00
SoulMicro, я уже почти доделал класс. Сейчас покажу...

Добавлено через 9 минут
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
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
 
namespace SerialPort_Threads
{
    
    public class MultiCOMWatcher
    {
        //Поля
        private string[] portsNamesArray;
        private SerialPort port;
        private bool watchStop;
        private List<byte> outData;
        
        //События
        public event EventHandler<WatcherEventArgs> exceptionEvent;
        public event EventHandler readCorrect;
 
        //Конструктор
        public MultiCOMWatcher(string[] ports)
        {
            if (ports.Length == 0)
                throw new ArgumentException("Ports array is empty!");
            portsNamesArray = ports;
            outData = new List<byte>();
            watchStop = false;
        }
 
        //Внешний метод прослушивания
        public void StartWatch()
        {
            Task.Factory.StartNew(() => { Watch(); });
        }
 
        //Внутренний метод прослушивания
        private void Watch()
        {
            //Внешний цикл
            while (!watchStop)
            {
                //Внутренний цикл(по количеству портов)
                for (int i = 0; i < portsNamesArray.Length; i++)
                {
                    //Конфигурирование порта
                    port = new SerialPort();
                    ConfigurePort(portsNamesArray[i], port);
 
                    port.Open();
                    port.DiscardInBuffer();
 
                    try
                    {
                        byte[] portWrite = { 0xc6, 0x01, 0xb0, 0xb1 };
                        if(ReadBlock(portWrite,outData,port,8))
                        {
                            if (readCorrect != null)
                            {
                                readCorrect(this, EventArgs.Empty);
                            }
                        }
                        else
                            throw new ArgumentException(string.Format("{0}{1}",
                                      "Data not present in ",port.PortName));
                    }
                    catch (Exception ex)
                    {
                        if (exceptionEvent != null)
                        {
                            WatcherEventArgs watch = new WatcherEventArgs(ex.Message);
                            exceptionEvent(this, watch);
                        }
                    }
                    finally
                    {
                        port.Close();
                    }
                }
            }
        }
 
        //Метод чтения блока данных из порта(аргументы - блок для записи в порт, 
        //лист для приема, сам порт из массива, количество байт которые необходимо считать
        private bool ReadBlock(byte[] portWriteBytes, List<byte> portReadBlock, SerialPort port, int count)
        {
            int waitIndex = 0;
            byte[] temp=new byte[count];
 
            portReadBlock.Clear();
            port.Write(portWriteBytes, 0, portWriteBytes.Length);
            while (waitIndex != 10)
            {
                Thread.Sleep(100);
                waitIndex++;
 
                if (port.BytesToRead == count)
                    break;
                if (waitIndex == 10)
                    return false;
            }
            port.Read(temp, 0, count);
            portReadBlock.AddRange(temp);
            return true;
        }
        //Внешний метод отмены прослушивания
        public void StopWatch()
        {
            watchStop = true;
        }
 
        //Свойство для принятых данных(readonly)
        public List<byte> OutData
        {
            get { return outData; }
        }
        //Метод конфигурирования порта
        private void ConfigurePort(string portName, SerialPort port)
        {
            port.PortName = portName;
            port.BaudRate = 9600;
            port.ReadTimeout = 500;
            port.Handshake = Handshake.None;
            port.Parity = Parity.Even;
        }
    }
 
    //Класс для аргумента события
    public class WatcherEventArgs:EventArgs
    {
        public readonly string Message;
        public WatcherEventArgs(string msg)
        {
            Message = msg;
        }
    }
}
Вот проверка. Она в консоли, но это не критично, в форме все будет работать точно так же.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
using System.IO.Ports;
using System.Threading;
 
namespace SerialPort_Threads
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] ports = SerialPort.GetPortNames();
            MultiCOMWatcher watcher;
 
            //Пытаемся создать класс, если портов нет-обрабатываем исключение и выход
            try
            {
                watcher = new MultiCOMWatcher(ports);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
            //Подключаем обработчик успешного чтения
            watcher.readCorrect += (s, e) =>
                {
                    //Тут обрабатываем событие успешного приема
                    Console.WriteLine(BitConverter.ToString(watcher.OutData.ToArray()));
                };
            //Подключаем обработчик ошибки чтения данных из порта
            watcher.exceptionEvent += (s, e) =>
                {
                    Console.WriteLine(e.Message);
                };
            //Запуск метода прослушивания
            watcher.StartWatch();
 
            //Задержка на 10 с (для проверки)
            Thread.Sleep(10000);
            
            //Остановка прослушивания
            watcher.StopWatch();
            Console.ReadLine();
        }
    }
}
Добавлено через 1 минуту
Естественно, передаваемые данные-это мой вариант, под то устройство что у меня есть и от которого я могу принять ответ. Вы измените под свое.
0
Заблокирован
23.06.2014, 07:44  [ТС]
так а если под конкретный пример. послать #10\r , COM2

Добавлено через 32 минуты
пишу так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     byte[] portWrite = Encoding.Unicode.GetBytes("#10\r"); 
                    
 
                        if (ReadBlock(portWrite, outData, port, 8))
                        {
                            if (readCorrect != null)
                            {
                                readCorrect(this, EventArgs.Empty);
                            }
                        }
                        else
                            throw new ArgumentException(string.Format("{0}{1}",
                                      "Data not present in ", port.PortName));
                    }
получаю Data not present in
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.06.2014, 08:15
DoomUnit, а вы уверены, что на такой запрос должен быть ответ? Если должен, какое количество байт должно быть в ответе? Подставьте это число в параметр метода приема (4 строка в приведенном вами участке кода, там стоит число 8) и посмотрите.
0
Заблокирован
23.06.2014, 11:17  [ТС]
в общем сделал таким способом
Кликните здесь для просмотра всего текста

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.IO;
using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
 
namespace MyComReader
{
    public partial class Form1 : Form
    {
        MyComReader three = new MyComReader();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
 
        #region mycom
        internal class MyComReader
        {
            private SerialPort port;
            private System.Timers.Timer timer;
            private System.Threading.Thread thread;
            readonly EventWaitHandle wh = new AutoResetEvent(false);
            private bool doWork;
            int i = 0;
            string value = "";
            private string inData = "";
 
            public void ThreadStart()
            {
                doWork = true;
                thread = new Thread(Execute);
                thread.Start();
              
 
                this.timer = new System.Timers.Timer();
                this.timer.Enabled = true;
                this.timer.Interval = 5000;
                this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
                this.timer.AutoReset = true;
                this.timer.Start();
            }
 
            public void ThreadStop()
            {
                doWork = false;
                timer.Stop();
                wh.Set();
            }
 
            void Execute()
            {
 
                while (doWork)
                {
                    if (port == null)
                    {
                        port = new SerialPort("COM2", 9600);
                        port.DataReceived += port_DataReceived;
                    }
                    if (!port.IsOpen)
                        port.Open();
 
                    port.Write("#10\r");
                    wh.WaitOne();
                  
                }
                if (port.IsOpen)
                    port.Close();
            }
 
            void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                wh.Set();
            }
            
            
            void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                
                SerialPort sp = (SerialPort)sender;
 
                inData += sp.ReadExisting();
               // MessageBox.Show(i++.ToString() +  inData);
                value = inData;
                if (value.Length > 10 && value.Contains('\r'))
                {
                    MessageBox.Show(value + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss\t"));
                    inData = "";
                }
 
                // проверка, если в InData появилась полная строка - отрезаем кусок
                // и обрабатываем, а лучше в другой поток для обработки передаем
 
            }
 
           
        }
        #endregion
 
        private void button1_Click(object sender, EventArgs e)
        {
            
            three.ThreadStart();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            three.ThreadStop();
        }
    }
}


Добавлено через 51 минуту
млин как бы еще по образу и подобию tcp бы сделать
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.06.2014, 11:23
Цитата Сообщение от DoomUnit Посмотреть сообщение
млин как бы еще по образу и подобию tcp бы сделать
асинхронные вызовы всё-таки существуют...
0
Заблокирован
23.06.2014, 11:33  [ТС]
к чему это?
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.06.2014, 11:48
DoomUnit, к тому, что образ и подобие с ручным запуском потоков и WaitHandle делать особо смысла нет.
0
Заблокирован
23.06.2014, 14:40  [ТС]
а почему нет?

Добавлено через 2 часа 14 минут
tcp сделал так. может кому понадобится. может кто подскажет
Кликните здесь для просмотра всего текста


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
        private void SelectCom()  //com port
        {
            try
            {
                NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";"));
                string sql = " SELECT   \"ID_TagName\" as id, \"F_ComPortIPAdress\",  \"F_ComQuery\", \"F_ComPort\",  \"F_ParseFunction\",                    \"F_TagReadTime\"           FROM ";
                sql += "\"SC_Tag\".\"T_TagName\" as tn,\"SC_Tag\".\"T_HardWareTag\" as hw , \"SC_Tag\".\"T_RealHardWare\" as rh            where  rh.\"ID_RealHardWare\" =   ";
                sql += "hw.\"F_RealHardWare_ID\"   and tn.\"F_HardWare_ID\" = hw.\"F_TagName_ID\"    and \"F_ServerName\"  =\'" + Environment.MachineName + "\' and \"F_ComPortIPAdress\" != '127.0.0.1' ";
 
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                ds.Reset();
                da.Fill(ds);
                dt = ds.Tables[0];
 
                if (ds.Tables[0] != null)
                {
                    InitAll();
                }
 
            }
            catch (Exception msg)
            {
                this.file.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss\t Select()") + msg.ToString());
                this.file.Flush();
                return;
            }
        }
 
        private void InitAll()
        {
            try
            {
                allListeners = new List<TcpComReader>();
 
                for (int xx = 0; xx < ds.Tables[0].Rows.Count; ++xx)
                {
                    string server = dt.Rows[xx][1].ToString();
                    string message = dt.Rows[xx][2].ToString() + "\r";                 
                    int port = Convert.ToInt32(dt.Rows[xx][3]);
                    int idcom = xx;
                    allListeners.Add(new TcpComReader(server, message, port, idcom));
                }
                min = Convert.ToInt32(dt.Rows[0][5]);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    if (Convert.ToInt32(dt.Rows[i][5]) < min)
                        min = Convert.ToInt32(dt.Rows[i][5]);
                }
 
                Go();
            }
            catch (Exception msg)
            {
                this.file.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss\t Select()") + msg.ToString());
                this.file.Flush();
                return;
            }
        }
 
        private void Go()
        {
            try
            {
                foreach (TcpComReader comListener in allListeners)
                {
 
                    comListener.ThreadStart();
                }
 
            }
            catch (Exception msg)
            {
                this.file.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss\t Select()") + msg.ToString());
                this.file.Flush();
                return;
            }
        }
        #region mycom
        internal class TcpComReader
        {
 
            private SerialPort port;
            private System.Timers.Timer timer;
            private System.Threading.Thread thread;
            readonly EventWaitHandle wh = new AutoResetEvent(false);
            private bool doWork;
            int i = 0;
            string value = "";
            private string inData = "";
            SerialPort _COM;
            string DataToSend;
            int IdCom;
            string ParseGlob = "";
            String Server ;
            int Port ;
            String msg;
 
            internal TcpComReader(String server, String message, Int32 port, Int32 idcom)
            {
                Server = server;
                Port = port;
                msg = message;
                IdCom = idcom;
            }
 
            public void ThreadStart()
            {
                doWork = true;
                thread = new Thread(Execute);
                thread.Start();
 
 
                this.timer = new System.Timers.Timer();
                this.timer.Enabled = true;
                this.timer.Interval = min;
                this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
                this.timer.AutoReset = true;
                this.timer.Start();
            }
 
            public void ThreadStop()
            {
                doWork = false;
                timer.Stop();
                wh.Set();
            }
 
            void Execute()
            {
                try
                {
                    while (doWork)
                    {
                        // 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(msg);
                        // 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);
                        value = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
 
 
                        NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";"));
                        conn.Open();
                        String Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\",\"F_Value\",\"F_Date\")  VALUES (" + dt.Rows[IdCom][0].ToString() + ",\'" + value + "\',\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\'   )");
                        NpgsqlCommand command = new NpgsqlCommand(Mystr, conn);
                        int rowsaffected;
                        rowsaffected = command.ExecuteNonQuery();
                        conn.Close();
                        // Close everything.
                        stream.Close();
                        client.Close();
                        wh.WaitOne();
                    }
                }
                catch
                {
                    return;
                }
            }
 
            void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                wh.Set();
            }
 
 
 
 
        }
        #endregion
 
        private void button1_Click(object sender, EventArgs e)
        {
            SelectCom();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            foreach (TcpComReader comListener in allListeners)
            {
                comListener.ThreadStop();
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.06.2014, 14:40

Не работает 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) ТО программа начинает криво работать в чем дело ?


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru