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

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

25.12.2012, 10:53. Показов 5557. Ответов 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
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
26.12.2012, 12:48  [ТС]
Студворк — интернет-сервис помощи студентам
Так там той логики - кот наплакал Час наблюдаю, пока полет нормальный. Утром за полчаса было три зависания (на разных машинах). Ждем-с
0
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
26.12.2012, 13:16  [ТС]
Все равно завис
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
26.12.2012, 18:14
знаю, что в vs есть профилировщик, можно запустить и наблюдать, когда и сколько ресурсов съедает приложение. Честно говоря, сам не пользовался, а надо бы, просто не настолько заинтересован в этом, если очень нужно, попробуйте, разберитесь.
1
25 / 25 / 5
Регистрация: 21.10.2009
Сообщений: 95
Записей в блоге: 1
27.12.2012, 14:21  [ТС]
Нашел проблему. Дело в том, что при вызове this.Invoke в случае, если очередь сообщений основной формы заполнена, не происходит ни постановки задания в очередь, ни выхода с исключением. В итоге основной поток виснет. Проблема характерна для .NET Framework 2.0. На более новых версиях пока не проверял. Решение напишу позже.
Источник
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2012, 14:21

Программа виснет
написал небольшой таймер все компилируется, но висит не работает код: //#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...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru