Имя: Пароль:
1C
1C 7.7
v7: Многопоточность — миф или реальность?
, ,
0 bigdenis22
 
29.11.16
18:32
Возможно ли выполнение кода в параллельном потоке? Например опрос датчиков на КОМ-портах, весов, - в фоновом режиме?
Для работы с ком портами используются паузы, и когда идет опрос портов раз в 2 секунды, - невозможно комфортно редактировать форму документа.
нашел такую тему : Кто нибудь создавал потоки на 1С 7.7 ?
попробовал прикрутить КОМПОНЕНТу VTOOLs, но при создании потока 1с валится, вроде нашел, что не совместима с FormEx.
Ещё пишут, что в DialMail обмен почтой может запускаться в отдельном потоке, но похоже, в моей ситуации это не поможет...

Может кто решал подобные задачи? поделитесь опытом?
72 Злопчинский
 
30.11.16
19:26
(71) возможность чего? вот есть мое приложение 1сная обработка или какой-то 1Сный1 код.
как мне программно получит или быть оповещенным о приходе данных с вскрытием конверта-оповещения и получения данных..?
73 Кирпич
 
30.11.16
19:30
(72) ну как обычно. в ВК работает поток, который постоянно опрашивает весы. вызываешь метод ВК, который возвращает текущий вес. если надо, ВК постоянно выводит вес в отдельном окне.
74 Torquader
 
30.11.16
21:08
(73) В отдельном окне в 7.7 очень проблематично - семёрка использует очередь сообщений, и при переходе кода со строки на строку идёт опрос очереди сообщений - тогда всё и прорисовывается, а вот когда выполняется отчёт или другая деятельность 1С, не требующая встроенного языка - очередь сообщений подвисает, если мы что-то выведем в окно через SendMessage - мы будем ждать освобождения очереди. Если после освобождения зайдут к нам, то будет DeadLock и всё.
Так что - обновлять окна 1С должна только по своей инициативе.
75 Кирпич
 
30.11.16
21:12
(74) ну я как бы в курсе чо там и как подвисает
76 Garykom
 
гуру
30.11.16
21:51
(33) Не нужны там ни формекс ни 1с++, штатной ОбработкаОжидания() прекрасно все делается.

В коде (32) просто несусветная глупость с "глСистема.Уснуть(..);"


глВесы;

Процедура глСчитать()
   Если глВесы.InBufferCount < 13 Тогда
      Возврат;
   Иначе
      Буфер= СокрЛП(глВесы.Input);
      пВес = Сред(Буфер,2,8);
      Сообщить("Вес="+пВес);
      // и т.д.

      глВесы.Settings = "19200,N,8,1";
      глВесы.Output = Симв(080)+Симв(013);
      ОбработкаОжидания("глСчитать", 2);
   КонецЕсли;
КонецПроцедуры

Процедура НачатьСчитывание()
   Если глВесы.PortOpen <> 0 Тогда
      глВесы.Settings = "19200,N,8,1";
      глВесы.Output = Симв(080)+Симв(013);
      ОбработкаОжидания("глСчитать", 2);
   КонецЕсли;
КонецПроцедуры
77 Garykom
 
гуру
30.11.16
21:51
IdleProcessing(<?>,)
ОбработкаОжидания(<?>,)
Синтаксис:
ОбработкаОжидания(<ИмяПроцедуры>,<ИнтервалВызова>)
Назначение:
Инициирует периодический вызов процедуры глобального модуля с заданным интервалом времени.
Возвращает имя процедуры глобального модуля, которая назначена для периодического запуска (на момент до исполнения процедуры).
Параметры:
<ИмяПроцедуры> - необязательный параметр. Строковое выражение - имя процедуры глобального модуля, которая будет вызываться периодически с временным интервалом <ИнтервалВызова>. Тело процедуры <ИмяПроцедуры> должно быть написано разработчиком конфигурации в глобальном программном модуле. Если в качестве параметра передается 'пустая строка', то ранее запущенный процесс прекращается.
<ИнтервалВызова> - необязательный параметр. Числовое выражение - интервал времени в секундах, с которым периодически будет вызываться процедура глобального модуля <ИмяПроцедуры>. Если в качестве параметра передается 0 (ноль), то ранее запущенный процесс прекращается.
78 Garykom
 
гуру
30.11.16
21:53
(76)+ Дополнение, если конфа уже использует ОбработкаОжидания() то нуна не забывать что может только одна "периодического запуска" работать, можно сохранить имя предыдущей обработки и вызывать ее когда нуна в своей.
79 Garykom
 
гуру
30.11.16
22:00
(76)+ Чтобы "штатно" обновлять на форме "вес", пишем его в "Перем глВес" в глобальнике.

И задаем формулу "ТекущийВес()" для текстового поля где

Функция ТекущийВес()
   Возврат глВес;
КонецФункции
80 Garykom
 
гуру
30.11.16
22:05
Да если юзер работает (набирает текст в поле ввода) то вызов обработки ожидания обычно выделяет все введенное в поле и следующим нажатием символа введенные до этого символы того...
81 Garykom
 
гуру
30.11.16
22:12
Кста штатная обработка ожидания в 7.7 пашет в "отдельном потоке", но любое взаимодействие с базой и данными (включая глобальные переменные) вызывает блокировки (фризы интерфейса).

С переменными не так заметно, но если в ней начать документы проводить (у меня в некоторых старых конфах такое сделано) то фризы ощутимые :)
82 Garykom
 
гуру
30.11.16
22:38
(79) Да "без работы на форме", т.е. без переходов между элементами формы, нажатий кнопок и т.д., т.е. без событий вызывающих перерисовку форму (перетаскивание не помогает) текст нифига не обновится сам и уже нужны извращения с Форма.Обновить().

Посмотри вот часики https://cloud.mail.ru/public/LSTZ/jWuzNnNmE
83 Torquader
 
01.12.16
00:47
Насколько я помню, нажатие ALT и вызов меню останавливают как обработку ожидания, так и вообще все обмены интерфейса, так как меню вызывает свой обработчик очереди событий, которые все ненужные ему события отправляет котику под хвостик.
84 Garykom
 
гуру
01.12.16
00:56
Ну пора уже 77 на заслуженный отдых.
85 Torquader
 
01.12.16
00:59
(84) В некоторых местах ещё клиппер работает, так что 7.7 ещё поживёт, пока есть кому конденсаторы на мамках перепаять.
86 Garykom
 
гуру
01.12.16
01:04
(85) Мдя, сча уже кондеры не спасают.
Вот где бы взять недорого мамки под 775 ?
87 Djelf
 
01.12.16
01:06
(86) Фигня! arduino преспособим! ;)
88 Garykom
 
гуру
01.12.16
01:13
(87) Смешно но иногда хочется купить им планшеты вместо компов... Только 1С77 на андроиде не очень, но тут МС подсуетился и выпустил на Win10 дешевые и даже с hdmi выходом.
А переходник hdmi-vga стоит 200 рублей.
89 Garykom
 
гуру
01.12.16
01:14
(88)+ Но эта Windows 10 убивает настройкой конечно.
90 Злопчинский
 
01.12.16
01:16
Обработка ожидания - зло
91 Garykom
 
гуру
01.12.16
01:17
Зло это из учетной системы хрен знает что делать. Когда давно есть JS в браузере.
92 Djelf
 
01.12.16
01:19
(91) +100
93 Злопчинский
 
01.12.16
01:31
Зачем постоянно допрашивать вес? Не проще ли дождаться сигнала о поступлении веса?
94 Это_mike
 
01.12.16
07:11
(78) формексовских обработок ожидания, емнип, может быть много - каждая управляется отдельно
95 DrZombi
 
гуру
01.12.16
07:25
Зачем вообще в 7.7 многопоточность? :)
96 Это_mike
 
01.12.16
07:32
(95) Щоб булО!®
97 ADirks
 
01.12.16
07:44
(94) я вот тоже так думал...  оказалось - нет
98 NorthWind
 
01.12.16
08:04
(89) а чем там настройка особенно отличается от Windows 7, к примеру?
99 NorthWind
 
01.12.16
08:06
(93) ну во-первых, можно хотеть полную копию дисплея весов на компе. Чтобы было видно как он меняется. Во-вторых, многие весы не имеют такого функционала как отдача окончательного веса, они просто возвращают содержимое своего дисплея по запросу и в этом содержимом есть признак стабильности веса - нестабилен или стабилен.
100 Mankubus
 
01.12.16
08:21
100
101 bigdenis22
 
01.12.16
11:11
(93) (99) У нас сейчас устанавливаются весы, которые, если будут сами выдавать вес, без запроса, то его считывать будет очень гиморно... передают слово в 14 бит, первый раз вес в первой половине, второй - во второй... и так через раз...
а если по запросу - то все ок, всё постоянно...
менять весы не предлагать, только эти весы живут нормально в наших условиях агресивных сред (высшая IP защита) за вменяемые деньги.
НО , в ближашем будущем, появится необходимость получать показания с других датчиков по запросу и выводить их на форму.

Еще раз повторюсь, необходимо, что-бы на форме (на экране) у оператора отображались оперативные данные с датчиков, чтоб он видел, какие данные запишутся при нажатии кнопки.
102 bigdenis22
 
01.12.16
11:17
(76) спасибо, идея понятна, буду думать как можно у себя это прикрутить...
просто у меня уже есть 5 типов датчиков(весов)и ещё будет добавлятся, работа с которыми описана в глобальной функции ПолучитьВес(), кусочек которой я приводил выше.
103 Garykom
 
гуру
01.12.16
11:18
(98) В Win7 переход после WinXP был простой, вот те "панель управления" где все в одном виде и понятно.

В Win10 тупейшая смесь нового и старого, как и в Win8 только чуть чуть получше. Например скажите как отключить запрос пароля при загрузке (автологон сделать)?

Да по прежнему работает "control userpasswords2" но на планшетах клавы то немае хардварной обычно...
104 Garykom
 
гуру
01.12.16
11:19
(103)+ "клавы немае" это к вопросу вызова шортката Win+R
105 Garykom
 
гуру
01.12.16
11:20
(102) Рефакторинг наше все, когда пишешь нечто большое то иногда 2-3 раза переписывать приходится. Потому что "первый блин комом" это классика жанра.
106 NorthWind
 
01.12.16
11:38
(103) Например скажите как отключить запрос пароля при загрузке (автологон сделать)?
Первая же ссылка при поиске - https://lifehacker.ru/2015/02/18/avtomaticheskij-vhod-windows-10-tp/
107 Garykom
 
гуру
01.12.16
11:41
(106) "Сделайте правый клик на кнопке «Пуск» в левом нижнем углу экрана."

Как??? Как сделать "правый клик" без мышки на сенсорном экране?
108 Garykom
 
гуру
01.12.16
11:42
(107) и да я в курсе что "долгий тап", но в инструкции по "первой ссылке" об этом ни слова!
109 Кирпич
 
01.12.16
11:42
(102) вот наваял такой вариант
в отдельном потоке опрашивает весы, показывает вес в отдельном окне. по требованию возвращает текущий вес. этот шкилет можно доработать до полной красоты с датчиками и прочими блэкджеками.
http://i85.fastpic.ru/big/2016/1201/32/9e6d3a1810a32665671fdf14c8425432.png
110 NorthWind
 
01.12.16
11:43
А подцепить bluetooth, к примеру, клаву не вариант? У меня даже к айпэду получалось ее цеплять, винда-то уж точно понимает
111 NorthWind
 
01.12.16
11:44
(110) к (107), (108)
112 Garykom
 
гуру
01.12.16
11:44
(110) Ха девайсы на Win10 это "обычные компы" и большинство имеют usb-host так что переходник и обычная клава/мышка не проблема.

Суть то не в этом а в тупизне разрабов M$
113 Garykom
 
гуру
01.12.16
11:46
(109) Думаешь ТС или его работодатели готовы платить? Были бы готовы уже давно наняли спеца.
114 NorthWind
 
01.12.16
11:47
(112) Вам просто нужно разобраться со вводом на устройстве, потому что ввод нестандартный, не такой как на десктопе. Разрабы тут ни при чем.
115 Кирпич
 
01.12.16
11:48
(113) думаю нет. я чисто по доброте душевной. решил попрограммировать немножко.
116 Garykom
 
гуру
01.12.16
11:48
(114) Эээ а нафуя было засовывать десктопную ось на планшету?
117 Garykom
 
гуру
01.12.16
11:49
(116)+ Причем в тоже самое время страдая непонятно чем и засовывая планшетный интерфейс в десктопную ось.

Эти вот плитки в Win8 были таким извратом на компах/ноутах без тача ))
118 Garykom
 
гуру
01.12.16
11:50
(117)+ *принудительно засовывая
119 NorthWind
 
01.12.16
11:50
(116) потому что на это есть спрос. И пользоваться этим при желании можно, надо только включить голову в процесс.
120 Garykom
 
гуру
01.12.16
11:54
(119) Да пользоваться можно, но включать голову это доп.затраты на которые можно пойти только при необходимости и(или) отсутствии вариантов.

А еще нуна с собой эту голову не забыть, что и подсказыает статистика продаж планшетов на андроид и на виндовс.
121 Garykom
 
гуру
01.12.16
11:55
(120)+ В смысле планшеты на win это замечательная штука но для специфического применения с использованием специалистов.
122 NorthWind
 
01.12.16
11:56
(120) не хотите забивать голову - не надо! Есть леново йога и сурфейс про. Там клава в комплекте и все прекрасно и легко. Несите ваши денежки.
123 Кирпич
 
01.12.16
11:57
пацаны вам сюда http://4pda.ru/
124 NorthWind
 
01.12.16
11:58
Ну да, оффтоп. Закругляюсь, тем более что это спор о фломастерах
125 Garykom
 
гуру
01.12.16
12:09
(123) Туда я только по делу, там флудить плохо получается, аудитория отмороженная ))
126 Garykom
 
гуру
01.12.16
12:10
(123) Кста это пример когда форум стал основным в отличие от исходной странички, как и миста.
127 bigdenis22
 
01.12.16
12:27
(113) (115) ну как бы зря... готовы и заплатить. в разумных пределах :)
128 Кирпич
 
01.12.16
12:29
(127) так платите быстрее пока художник в запой не ушел
129 Garykom
 
гуру
01.12.16
12:31
(128) +1

вариант с правильной ВК наилучший
130 bigdenis22
 
01.12.16
12:55
(109) Интересная особенность новой версии:
запускаю на терминале, порты пробрасываются в сессию, при запуске тест.ерт отваливается порт...
F:\Documents and Settings\denis>change port
AUX = \DosDevices\COM1
COM1 = \Device\RdpDrPort\;COM1:133\tsclient\COM1
COM2 = \Device\Serial1
COM7 = \Device\RdpDrPort\;COM7:133\tsclient\COM7
LPT1 = \Device\RdpDrPort\;LPT1:133\tsclient\LPT1
PRN = \DosDevices\LPT1

F:\Documents and Settings\denis>change port
AUX = \DosDevices\COM1
COM1 = \Device\RdpDrPort\;COM1:133\tsclient\COM1
LPT1 = \Device\RdpDrPort\;LPT1:133\tsclient\LPT1
PRN = \DosDevices\LPT1

весы на ком7 (в обработке поправил)
до этого было все норм.
131 Кирпич
 
01.12.16
13:01
(130) хрен знает. я в терминале не пробовал.
132 Кирпич
 
01.12.16
13:05
в инете надо поглядеть
http://forum.oszone.net/post-2019225.html
133 Кирпич
 
01.12.16
13:12
отправил другой вариант. может заработает
134 bigdenis22
 
01.12.16
16:41
(133) результаты наблюдений:
Ком7 это действительно подключение через ЮСБ переходник, и порт отваливается (только на последних двух версиях ВК).
переключил на КОМ1 в мамке, - он не отваливается, но и никаких данных по КОМ порту не ходит, смотрю "Serial Port Monitor" ...
что локально, что на терминале
commScales
commError
Параметр задан неверно

при этом, включаю старый вариант (на MSCOMM) работает на ура.
135 Кирпич
 
01.12.16
16:45
(134) покаж код
136 Кирпич
 
01.12.16
16:45
у меня всё работает
137 bigdenis22
 
01.12.16
17:25
(76) спасибо за идею. переписал получение данных вот так:
    ИначеЕсли РабочееМесто.ТипТО=Перечисление.ТипыВесов.SMART Тогда                              //SMART
        Если Весы.PortOpen <> 0 Тогда
            Если ЖдемПоказаний=1 Тогда
                Если Весы.InBufferCount < 13 Тогда
                    //Возврат;
                Иначе
                    Буфер= СокрЛП(Весы.Input);
                    пВес = Сред(Буфер,2,8);
                    глВес=Число(пВес);
                    ЖдемПоказаний=0;
                КонецЕсли;
            КонецЕсли;
            
            Весы.Settings = "19200,N,8,1";
            Весы.Output = Симв(080)+Симв(013); // команда P + возврат каретки  
            ЖдемПоказаний=1;
            пВес = глВес;
            //            Сообщить("прием+++"+Строка(Буфер)+"\\(("+Сред(Буфер,2,8)+"))//");
        КонецЕсли;
    ИначеЕсли РабочееМесто.ТипТО=Перечисление.ТипыВесов.CAS_Ci2001A Тогда                //       CAS_Ci2001A

функция вызывается каждую секунду, у меня фризов не наблюдается. завтра проверим на боевом рабочем месте.

(135) я в твоей конфиге и обработке пробовал (после того как в моей перестало показывать), только КОМ менял на 7 и на 1.
138 Кирпич
 
01.12.16
17:30
(137) а 19200 нарисовал тоже? там вроде 9600 было.
странно, что не работает. у меня как часы.
139 Кирпич
 
01.12.16
17:32
строка должна быть "19200,8,N,1"
может ты строку "19200,N,8,1" там поставил?
140 Кирпич
 
01.12.16
17:33
скорее всего :)
141 bigdenis22
 
01.12.16
18:06
ВК.Старт("COM1","9600,8,N,1",10000,500,Симв(080)+Симв(013),"",1);

кстати да, только счас обратил внимание - в предыдущей версии не было параметров порта... может из-за скорости и сложился конфуз... счас проверю.
142 bigdenis22
 
01.12.16
19:25
+ (141) поменял скорость на 19200, - то же самое
commScales
commError
Параметр задан неверно
143 Кирпич
 
01.12.16
19:30
Я думал ты 8 и N перепутал. По идее такая ошибка при конфиге порта должна вылететь. Завтра найду сканер, попробую. На виртуальных портах все работает. Даже через RDP.
144 Serginio1
 
01.12.16
20:18
145 Кирпич
 
01.12.16
20:45
+(143) можно еще 0 вместо 1 поставить в параметрах. 0 у меня значит 1 бит четности.
146 Кирпич
 
01.12.16
20:47
(144) я уж думал не придешь
147 trdm
 
01.12.16
20:59
(137) > функция вызывается каждую секунду, у меня фризов не наблюдается. завтра проверим на боевом рабочем месте.

Нафиг такой опрос на операторском месте???
148 Кирпич
 
01.12.16
21:22
Тьфу блин. Не четности, а стоп бит. Короче "19200,8,N,0"
149 Serginio1
 
01.12.16
21:37
(146) Я думал ты сам посоветуешь
Использование классов .Net в 1С для новичков
150 Кирпич
 
01.12.16
22:57
Проверил на нульмодемном кабеле. И точно! Если 1, то выдает ошибку. Короче 19200,8,N,0 и будет работать.
151 bigdenis22
 
02.12.16
10:35
(147) что-бы на форме "оперативно отображались изменения показаний... допустимо раз в 2 секунды, раз в 3 секунды ещё можно, но уже менее комфортно. большая скважность - негодится.
(150) сейчас буду посмотреть.
152 bigdenis22
 
02.12.16
12:11
(150) локально заработало, но с разрядностью что-то не так:
 000006
это 64, 68 кг.
может в 1 с возвращать целиком буффер? а там вычленять?
153 losky_9
 
02.12.16
12:18
154 bigdenis22
 
02.12.16
12:38
+ (152) и в окошке и в сообщении перед " 000006" идет непечатный символ типа буквы "г" в обратную сторону... наверно разделитель какой то.
кстати, обратил внимание, ты считываеш 8 бит из порта :
[02/12/2016 11:33:21] Written data
    50 0d                                             P.              
[02/12/2016 11:33:21] Read data
    02 20 30 30 30 30 30 35                           . 000005        
[02/12/2016 11:33:21] - Close port COM1

а я 13

[02/12/2016 11:35:56] Read data
    02 20 30 30 30 30 30 32 33 4b 47 4d 0d            . 0000023KGM.    
[02/12/2016 11:35:56] Written data
    50 0d                                             P.              
[02/12/2016 11:35:57] Read data
    02 20 30 30 30 30 30 32 31 4b 47 20 0d            . 0000021KG .
155 Salimbek
 
02.12.16
12:45
(154) Вероятно, что подразумевалось "ты считываешь 8 байт"
156 Salimbek
 
02.12.16
12:46
Но правильнее - до символа-терминатора считывать, 0d вроде...
157 Кирпич
 
02.12.16
12:49
(154) ну там просто стоит считывать всё подряд. нужно до терминатора считывать или чего там весы передают.
158 Кирпич
 
02.12.16
12:55
отправил новую версию. последний параметр - терминатор
159 Кирпич
 
02.12.16
12:56
типа так теперь запускать
ВК.Старт("COM3","19200,8,N,0",10000,500,Симв(080)+Симв(013),"",1,Симв(013));
160 Кирпич
 
02.12.16
13:06
потом сделаю чтобы можно было в поток код JS передавать и пускай читает пишет что угодно. типа очень универсально.
161 Salimbek
 
02.12.16
13:07
(160) И эти люди запрещают мне писать на Ruby ! :-)
162 Кирпич
 
02.12.16
13:08
(161) да пиши, пиши.
163 Кирпич
 
02.12.16
13:11
(161) ну и у меня будет всё в одной dll. JS будет встроенный. Или интерпретатор СИ встроенный. Или оба два.
164 Кирпич
 
02.12.16
13:13
А потом моя ВК станет международной шахматной столицей.
165 Torquader
 
02.12.16
13:15
Чем вам ещё и JS упёрся - видимо - проблемы со сборкой мусора и залочкой объектов из-за этого вам просто не знакомы ?
166 Кирпич
 
02.12.16
13:22
(165) Да какая нафиг сборка мусора. Просто примитивные скрипты писать. Типа прочитал из порта, чего нибудь сделал и в 1с отправил.
Просто весы такая фигня, что универсально, без программирования ничего не получится. Какие нибудь весы, например, могут вес в формате BCD каком нибудь передавать. И чего с ними делать тогда? А так в скрипте все преобразования сделал и вернул в 1с красивое значение.
167 Кирпич
 
02.12.16
13:23
я ж не собираюсь NodeJS туда запихивать. Хотя пригодилось бы кому нибудь :)
168 Torquader
 
02.12.16
13:30
(166) Был такой язык Pascal Script, он как-то попонятнее выглядел.
А если Microsoft Script Control прикручивать, то там VbScript есть - язык, в котором в функции и процедуры все параметры по ссылке передаются, и он быстрее JavaScript, реализованного в том же Microsoft Script Control.
169 Кирпич
 
02.12.16
13:33
(168) ну вот что-то из этого можно взять. или сразу треш в виде tcc
170 uno-group
 
02.12.16
13:53
vk_rs232 вполне нормально работает. неправильно построен алгоритм работы с весами. Сейчас тоже бьюсь с весами. Ушел нафик от всех шатных мозгов. тензодатчики + Своя платка с ардулино и далее хоть в сеть хоть в ком порт, хоть в вайфай, хоть блюпуп. 20-30 баксов за электронику и весы выдают данные как мне нужно.
171 Serginio1
 
02.12.16
15:11
(152) Там по ссылке в 144 есть отчет правда на 8 ке есть отчет TestSerialPort
Внутри данные получаются

Процедура DataReceived(Данные)
    sp1 = Данные.sender;
    ШтрихКод = sp1.ReadExisting();
    Компорт = sp1.PortName;
    Сообщить(СтрШаблон("ШК=%1 Порт=%2",ШтрихКод,Компорт));
    
КонецПроцедуры


Можешь читать как массив байт

    bytes = sp1 .BytesToRead;
    buffer = Врап.СоздатьМассив("System.Byte",bytes);
    sp1 .Read(buffer, 0, bytes);

Ну и обрабатывай массив байт как тебе хочется
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс