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

Виснет программа, слушающая COM порт

25.12.2012, 10:53. Показов 5218. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня!

Помогите с проблемой пожалуйста. Есть сканеры штрих-кодов Symbol LS2208, работают в режиме эмуляции COM порта. Написал класс, который слушает список COM портов и при получении строки генерирует событие:

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
public class BarCodeScanner
    {
        class OneComPort
        {
            public SerialPort ComPort { get; set; }
            public string FullBarCode { get; set; }
            public void SetFullBarCode(string val)
            {
                FullBarCode = val;
            }
        }
 
 
        public delegate void BarcodeEventHandler(string Barcode, string PortName);
        public event BarcodeEventHandler OnBarcodeScanned;
 
        public delegate void ErrorEventHandler(Exception Ex);
        public event ErrorEventHandler OnError;
 
        public delegate void SuccessEventHandler(string PortName);
        public event SuccessEventHandler OnSuccess;
 
        Dictionary<string, OneComPort> ListeningPorts;
 
        public BarCodeScanner()
        { }
 
        public void StartListening(string PortName)
        {
            if (ListeningPorts == null)
                ListeningPorts = new Dictionary<string, OneComPort>();
 
            Thread ForAdd = new Thread(new ParameterizedThreadStart(WaitBarcode));
            ForAdd.IsBackground = true;
            OneComPort tmp = new OneComPort { ComPort = new SerialPort((string)PortName), FullBarCode = "" };
            ListeningPorts.Add(PortName, tmp);
            ForAdd.Start(PortName);
        }
 
        public void StopListening()
        {
            foreach (KeyValuePair<string, OneComPort> temp in ListeningPorts)
                if ((temp.Value.ComPort != null) && (temp.Value.ComPort.IsOpen))
                    temp.Value.ComPort.Close();
        }
 
        void WaitBarcode(object PortName)
        {
            try
            {
                string PortNum = (string)PortName;
                ListeningPorts[PortNum].ComPort.DataReceived += new SerialDataReceivedEventHandler(_comPort_DataReceived);
                ListeningPorts[PortNum].ComPort.Open();
                if (OnSuccess != null)
                    OnSuccess(ListeningPorts[PortNum].ComPort.PortName);
                int Counter = 0;
                string LastCode = "";
                ListeningPorts[PortNum].SetFullBarCode("");
                while (true)
                {
                    if (!ListeningPorts[PortNum].ComPort.IsOpen)
                        return;
 
                    Thread.Sleep(50);
                    try
                    {
                        if ((ListeningPorts[PortNum].FullBarCode != "") && (LastCode == ListeningPorts[PortNum].FullBarCode))
                            Counter++;
                        else
                            LastCode = ListeningPorts[PortNum].FullBarCode;
 
                        if (Counter >= 3)      ///5 * 50 ms (in Thread.Sleep(50);) = 250 ms - min delay time
                        {
                            Counter = 0;
                            LastCode = "";
                            if (OnBarcodeScanned != null)
                                OnBarcodeScanned(ListeningPorts[PortNum].FullBarCode, PortNum);
                           
                            ListeningPorts[PortNum].ComPort.DiscardInBuffer();
                            ListeningPorts[PortNum].SetFullBarCode("");
                        }
 
                    }
                    catch (Exception Ex)
                    {
                        ListeningPorts[PortNum].SetFullBarCode("");
                        if (OnError != null)
                            OnError(Ex);
                    }
                }
            }
            catch (Exception Ex)
            {
                if (OnError != null)
                    OnError(Ex);
            }
 
        }
 
        void _comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            ListeningPorts[(sender as SerialPort).PortName].SetFullBarCode(ListeningPorts[(sender as SerialPort).PortName].FullBarCode + (sender as SerialPort).ReadExisting().Replace("\0", ""));
        }
 
    }
Проблема в том, что через некоторое время нормальной работы программа, использующая этот класс, виснет. Причем из кода видно, что прослушка сканера идет в отдельном потоке и если что и должно виснуть, то только он. Но зависает вся программа. Причем достаточно случайно, связи между использованием или не использованием сканера не наблюдаю. Проблема присуща только программам с формой, поскольку есть еще службы (на четырех ПК), использующие этот же класс, с ними все нормально. Проблема воспроизводится на семи разных ПК (где-то чаще, где-то реже), общая только ОС - Win XP SP3 VL. Учетка, под которой работает программа входит в группу локальных администраторов, службы работают от Local System.
Буду рад услышать любые предположения.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2012, 10:53
Ответы с готовыми решениями:

Виснет программа при компиляции, степовер не работает, так же виснет
Виснет программа при компиляции, степовер не работает, так же виснет. Программа - простейший калькулятор. ...

Виснет программа
from tkinter import ttk from tkinter import* import smtplib from email.mime.text import MIMEText from email.mime.multipart import...

Виснет программа...
Когда происходит Get, Set pixels хотел поставить progress bar, чтобы он показывал время выполнения этой функции, но progress bar начинает...

23
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 11:02
Я думаю, что приведенный код ни при чем. Наверняка основной поток виснет по своей причине, которая никак не связана с ком-портом.
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 11:09  [ТС]
Тоже так думал, но у меня две разных программы (одну из которых я даже успел переписать чуть ли не полностью), общее только использование сканеров. И обе виснут Еще обе используют хук на клавиатуру этим классом, но хук работает и в других местах с WinForms:

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
public class KeyboardHooker
    {
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
 
        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);
 
        [DllImport("user32.dll")]
        static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
 
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
 
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
        const int WH_KEYBOARD_LL = 13; 
        const int WM_KEYDOWN = 0x100; 
 
        private static LowLevelKeyboardProc _proc = hookProc;
 
        private static IntPtr hhook = IntPtr.Zero;
 
        public delegate void KeyPressedEventHandler(int VirtualCode);
        public static event KeyPressedEventHandler OnKeyPressed;
 
        static Dictionary<int, bool> Keys;
 
        public static void AddVirtCode(int Code, bool Skip = false)
        {
            if (Keys == null)
                Keys = new Dictionary<int, bool>();
 
            Keys.Add(Code, Skip);
        }
 
        public static void Start()
        {
            SetHook();
        }
 
        private static void SetHook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
        }
 
        private static void UnHook()
        {
            UnhookWindowsHookEx(hhook);
        }
 
        private static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            try
            {
                if ((code >= 0) && (wParam == (IntPtr)WM_KEYDOWN))
                {
                    if (Keys.ContainsKey(Marshal.ReadInt32(lParam)))
                    {
                        if (OnKeyPressed != null)
                            OnKeyPressed(Marshal.ReadInt32(lParam));
 
                        if (Keys[Marshal.ReadInt32(lParam)])
                            return CallNextHookEx(hhook, code, (int)wParam, lParam);
                        else
                            return (IntPtr)1;
                    }
                }
            }
            catch { }
            return CallNextHookEx(hhook, code, (int)wParam, lParam);
        }
 
    }
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 11:25
Хук тоже работает в отдельном потоке? Если нет, надо вынести.

Сложно так сказать издалека о причине повисаний, но это иногда случается при исчерпании ресурсов (например, создается много-много объектов IDisposable, для которых не вызывается Dispose() после использования).

Попробуйте сперва локализовать место, где происходит повисание, путем ведения лога или как-то еще. Я все жу думаю, что дело не в процессе ком-порта.
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 11:38  [ТС]
Хук встраивается в цепочку обработчиков, как я понимаю, и уже оттуда генерирует событие (кстати его и правда неплохо бы в отдельном потоке генерировать, чтоб система обработку нажатия продолжила)

А насчет логов - пробовал конечно, непредсказуемо все. Виснет просто в процессе ожидания. Вкратце назначение одной из программ - на складе стоит ПК с сенсорным монитором, на нем висят сканеры. Периодически к этому ПК подходят работники, сканируют штрих-коды документов и вводят данные по этим документам. Так вот жалуются, что бывает подходят к ПК, а он висит. Т.е. виснет не в результате чьих-то действий, а в процессе ожидания сканирования. Когда зависает - количество потоков у процесса и количество памяти не большое, т.е. это не утечки где-то. Может есть какая-то специфика работы с эмулированными COM портами, вы не сталкивались?
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 12:34
Возможно, дело в хуках. Вынести их стоит в любом случае.
С портами дела не имел, но все равно дочерний поток не должен вешать основной.

У меня была такая проблема: программа через некоторое время переставала выполнять определенные действия (отправку запросов на удаленный сервер), долго не мог понять в чем дело, пока не заметил, что не завершал (Dispose) объекта-запроса. Т.е. каждый раз (раз в секунду) у меня создавался IDisposable объект, для которого не вызывался Dispose. В итоге расходов памяти не было, но через какое-то время программа переставала работать (оне не висла, не вылетала, но нужных действий не выполняла). Возможно, у вас аналогичный случай.

Наверное дело в обработчике события OnBarcodeScanned, можете привести его код?
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 13:00  [ТС]
Цитата Сообщение от Doomer3D Посмотреть сообщение
Наверное дело в обработчике события OnBarcodeScanned, можете привести его код?
Да, конечно, но там все довольно скучно:
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
        void ProcessPack(string DocumentBarcode, string EmployeeBarcode)
        {
            string CurrentDocID = "";
            string CurrentUserID = "";
            string CurrentDocNo = "";
            string CurrentUserName = "";
            string CurrentClient = "";
            string CurrentClientCode = "";
 
 
            System.Data.SqlClient.SqlDataReader MyReader = SQLHelper.ExecuteReader(@"
SELECT TOP 1
    DocTable.IDDOC as IDDOC, 
    ClientsTable.Descr as ClientName, 
    ClientsTable.Code as ClientCode
FROM 
    DH" + Settings.Instance["DocDef"].ParamValue + @" as DocTable (nolock) 
INNER JOIN 
    SC72 as ClientsTable (nolock) ON ClientsTable.ID = DocTable." + Settings.Instance["ClientField"].ParamValue + @" 
WHERE 
    DocTable." + Settings.Instance["BarcodeField"].ParamValue + " = '" + DocumentBarcode + "'");
            if (MyReader != null)
            {
                if (MyReader.Read())
                {
                    CurrentDocID = MyReader["IDDOC"].ToString();
                    CurrentClient = MyReader["ClientName"].ToString();
                    CurrentClientCode = MyReader["ClientCode"].ToString();
                }
                MyReader.Close();
            }
            else
            {
                RespDocBC = "";
                RespEmpBC = "";
                ShowMessage("Документ не найден", MessagesTypes.Error);
                return;
            }
 
            MyReader = SQLHelper.ExecuteReader(@"
SELECT TOP 1
    EmpBarcodes.EmployeeID as EmployeeID
FROM 
    ___EmployeeBarcodes as EmpBarcodes 
WHERE 
    EmpBarcodes.EmployeeBarcode = '" + EmployeeBarcode + @"'
");
            if (MyReader != null)
            {
                if (MyReader.Read())
                {
                    CurrentUserID = MyReader["EmployeeID"].ToString();
                    MyReader.Close();
                }
                else
                {
                    ShowMessage("Сотрудник не найден", MessagesTypes.Error);
                    MyReader.Close();
                    return;
                }
            }
            else
            {
                RespDocBC = "";
                RespEmpBC = "";
                ShowMessage("Сотрудник не найден", MessagesTypes.Error);
                return;
            }
 
            MyReader = SQLHelper.ExecuteReader(@"
SELECT 
    [Value] as RespID
FROM 
    " + Settings.Instance["ResponsiblesTable"].ParamValue + @" 
WHERE 
    DocID = '" + CurrentDocID + @"' 
    AND DocIDDef = " + Settings.Instance["DocDef"].ParamValue);
 
 
            bool HaveResponsable = false;
            if (MyReader != null)
            {
                if (MyReader.HasRows)
                    HaveResponsable = true;
                MyReader.Close();
            }
 
            if (!HaveResponsable)
            { 
                QuestionForm MyF = new QuestionForm();
                if (MyF.ShowDialog() == System.Windows.Forms.DialogResult.No)
                    return;
                else
                    SQLHelper.ExecuteNonQuery("INSERT INTO " + Settings.Instance["ResponsiblesTable"].ParamValue + " (DocID, DocIDDef, Value) VALUES ('" + CurrentDocID + "', " + Settings.Instance["DocDef"].ParamValue + ", '" + CurrentUserID + "')");
            }
 
            PackagesSelector _PackForm = new PackagesSelector(CurrentDocID, CurrentUserID, CurrentDocNo, CurrentUserName, CurrentClient, CurrentClientCode);
            _PackForm.ShowDialog();
        }
 
        void PackScanner_OnBarcodeScanned(string Barcode, string PortName)
        {
            switch (Barcode.Length)
            {
                case 13:
                    if (Barcode.Substring(10, 1) != "3")
                    {
                        ShowMessage("Неправильный тип документа", MessagesTypes.Error);
                        break;
                    }
                    PackDocBC = Barcode;
                    SetWaitingText("Отсканируйте свой бейдж");
                    break;
                case 8:
                    if (Barcode.Substring(0, 3) != "CGZ")
                    {
                        ShowMessage("Неверный штрих-код", MessagesTypes.Error);
                        break;
                    }
                    PackEmpBC = Barcode;
                    if (PackDocBC != "")
                    {
                        ProcessPack(PackDocBC, PackEmpBC);
                        SetWaitingText("Отсканируйте документ");
                    }
                    PackDocBC = "";
                    PackEmpBC = "";
                    break;
                default:
                    PackEmpBC = "";
                    PackDocBC = "";
                    ShowMessage("Неверный штрих-код", MessagesTypes.Error);
                    break;
            }
        }

Насчет IDisposable - у меня такой код есть, может из-за него быть, как вы считаете? Этот код просто делает движения на экране ожидания, добавляет тексту "Отсканируйте документ" точки в начале и в конце, т.е. получается что-то вроде
Отсканируйте документ
.Отсканируйте документ.
..Отсканируйте документ..
...Отсканируйте документ...
Отсканируйте документ
.Отсканируйте документ.
..Отсканируйте документ..
...Отсканируйте документ...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void LabelUpdater()
        {
            int countOfPoints = 0;
            string tmp = "";
            while (true)
            {
                countOfPoints++;
                if (countOfPoints > 3)
                    countOfPoints = 0;
                tmp = "";
                for (int i = 0; i < countOfPoints; i++)
                    tmp += ".";
                try
                {
                    this.Invoke(new Action<string>((s) => label1.Text = s + LabelText + s), tmp);
                }
                catch { }
                Thread.Sleep(500);
            }
        }
Здесь же объект каждый раз создается Попробую убрать.

Добавлено через 13 минут
Изменил на

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void LabelUpdater()
        {
            int countOfPoints = 0;
            string tmp = "";
            int i;
            Action<string> Del = new Action<string>((s) => label1.Text = s + LabelText + s);
            while (true)
            {
                countOfPoints++;
                if (countOfPoints > 3)
                    countOfPoints = 0;
                tmp = "";
                i = 0;
                for (i = 0; i < countOfPoints; i++)
                    tmp += ".";
                try
                {
                    this.Invoke(Del, tmp);
                }
                catch { }
                Thread.Sleep(500);
            }
        }
посмотрим. Спасибо за подсказку!
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 13:05
Я думаю, дело в MyReader и _PackForm. Оба этих объекта требуют уничтожения после использования, особенно MyReader.

Например:

C#
1
2
MyReader.Close();
return;
А надо:

C#
1
2
3
MyReader.Close();
MyReader.Dispose();
return;
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 14:07  [ТС]
Все равно завис. Причем на моих глазах - в этот момент никаких действий не происходило. Обратил внимание, что в диспетчере задач есть столбец "Ошибок страниц", так вот он растет очень быстро, около 5000 в секунду, и на момент зависания было значение около 2 500 000. Если убрать цикл рисования точек - не растет, растет только если перерисовывается окно (те же точки или если окном диспетчера задач по моему окну поводить). Но значение этого параметра на других ПК (там где не зависло) было гораздо выше (6 млн).

Добавлено через 20 минут
Изменил индикацию с точек на мигание цветом, вроде количество ошибок страницы почти перестало расти. Посмотрим..
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 14:22
А что за цикл рисования точек? Может быть, там IDisposable не удаляете?
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 14:28  [ТС]
Вот он, я ранее писал о нем. На экране есть Label с текстом типа "Отсканируйте документ". Во время ожидания документа к нему слева и справа пририсовываются точки. Точнее даже приписываются - просто меняется текст Label в цикле.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        void LabelUpdater()
        {
            int countOfPoints = 0;
            string tmp = "";
            int i;
            Action<string> Del = new Action<string>((s) => label1.Text = s + LabelText + s);
            while (true)
            {
                countOfPoints++;
                if (countOfPoints > 3)
                    countOfPoints = 0;
                tmp = "";
                i = 0;
                for (i = 0; i < countOfPoints; i++)
                    tmp += ".";
                try
                {
                    this.Invoke(Del, tmp);
                }
                catch { }
                Thread.Sleep(500);
            }
        }
Сейчас исправил на:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void LabelUpdater()
        {
            Action<Color> Del2 = new Action<Color>((a) => label1.ForeColor = a);
            Color Now = Color.Black;
            while (true)
            {
                if (Now == Color.Black)
                    Now = Color.White;
                else
                    Now = Color.Black;
                this.Invoke(Del2, Now);
                
                Thread.Sleep(1000);
            }
       }
Пока работает, счетчик ошибок тоже растет, но не так быстро - около 50 в секунду.
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 14:32
А если убрать этот код, то не растет?

Правильнее написать что-то вида

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
public delegate void SetColorDelegate(Color color);
 
...
 
private SetColorDelegate setColorDel = new SetColorDelegate(SetColor);
 
...
 
private void SetColor(Color color)
{
    label1.ForeColor = color;
}
 
...
 
            while (true)
            {
                if (Now == Color.Black)
                    Now = Color.White;
                else
                    Now = Color.Black;
                this.Invoke(setColorDel, Now);
                
                Thread.Sleep(1000);
            }
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 14:43  [ТС]
Все равно завис Причем этот счетчик не большое значение имел, похоже, что проблема не в нем.
Если убрать код, то не растет, только при перерисовке окна (например, если диспетчером задач по окошку повозить).
0
 Аватар для Doomer3D
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
25.12.2012, 15:12
Даже не знаю, что вам подсказать...

Можете сформулировать, как именно происходит зависание? Какие именно части кода перестают работать?
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 16:20  [ТС]
Да тут и описывать особо нечего, что интересно... Вешается основной поток формы через случайный промежуток времени. Возможно, что через некоторый интервал бездействия - это предположение, основанное на том, что те ПК, через которые проходит больше документов, виснут реже, чем те, на которых почти не идет работа. Повторить на своей машине не могу. Все действия происходят в фоновых потоках (в основном). Ощущение, как будто форма просто перестает отвечать на сообщения Windows. Сейчас попробовал выставить параметр ShowInTaskbar формы в true (раньше был false, чтоб не маячила на панели задач), понаблюдаю.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
25.12.2012, 17:58
Не до конца разобрался в вашем проекте;
я так понимаю, программа имеем всего один фоновый поток, в котором ведется прослушка, или же их несколько?
Если несколько, то можно попробовать понизить приоритет потоков, поскольку если их становится много, то возможно, они вытесняют, главный поток, отсюда и подвисания.

Добавлено через 2 минуты
Причем это как раз может происходить в произвольные моменты времени.
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
25.12.2012, 18:16  [ТС]
День добрый.
В программе есть основной поток формы, куда приходят события из класса BarCodeScanner. Класс BarCodeScanner слушает набор COM портов, каждый в своем потоке. При получении строки из какого-либо порта генерируется событие, которое обрабатывается в основном потоке формы. Вся программа (все потоки) периодически виснут. Причем найти связь с каким-либо событием не удается. При этом не просто подвисает, а конкретно виснет, не реагируя на сворачивание, Alt-F4 и т.д.

Добавлено через 1 минуту
Т.е. надо понизить приоритеты всех потоков, кроме основного? Спасибо, сейчас попробую.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
25.12.2012, 18:20
Ну да, именно так . Если интерфейс подвисает, значит основной поток вытесняется.
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
26.12.2012, 11:55  [ТС]
Понизил приоритет потоков, читающих информацию со сканеров. Количество зависаний увеличилось, по крайней мере субъективно. Попробую повысить
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
26.12.2012, 12:33
Странно, что-то в логике тогда
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2012, 12:33
Помогаю со студенческими работами здесь

Программа виснет
написал небольшой таймер все компилируется, но висит не работает код: //#include &lt;chrono&gt; #include &lt;ctime&gt; #include...

программа виснет
Помогите пожалуйста, мне необходимо вычислить 2 корня уравнения tg(m)=m,то есть у меня есть форма на ней кнопка и 2 лэйбла,при нажатии этой...

Виснет программа
Здравствуйте, пишу отладчик под windows, использую winapi и qt, написал цикл обработки сообщений отладки, он стандартный: DEBUG_EVENT...

Виснет программа
Ребята, объясните пожалуйста рядовому. После ввода M и S консоль просто зависает и всё(прикрепил картинку). ...

Виснет программа
Виснет программа: procedure TForm1.Button8Click(Sender: TObject); begin editnum:=3; while...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru