Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Приложение "не отвечает" при длительном выполнении кода в классе (число прочтений - 7186 )
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Приложение "не отвечает" при длительном выполнении кода в классе
31. Января 2017 :: 05:52
Печать  
Кто-нибудь еще занимается 1С++?
Возникла следующая проблема. В класс было вынесено частичное перепроведение документов. В цикле выводится в окно сообщений текущий проводимый документ. Через некоторое время (скорее после потери фокуса приложением) главное окно 1С перестает обновляться, новые сообщения уже не появляются и все приложение уходит в белый туман. Хотя код продолжает нормально выполняться.
Тот же код вынесенный в обработку нормально отрабатывает без подвисания отрисовки.
Попытки обновить главное окно (UpdateData, UpdateWindow, RedrawWindow) внутри цикла в классе ни к чему не привели. Как и попытка притормозить слипом.
Кто-нибудь боролся с такой напастью?
  

FormEx developer
Наверх
www  
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #1 - 31. Января 2017 :: 06:21
Печать  
АЛьФ писал(а) 31. Января 2017 :: 05:52:
Через некоторое время (скорее после потери фокуса приложением) главное окно 1С перестает обновляться, новые сообщения уже не появляются и все приложение уходит в белый туман. Хотя код продолжает нормально выполняться.
...
Кто-нибудь боролся с такой напастью?
У 1С это хроническая болезнь.
Если скажем конфигуратор производит переиндексацию, то если переключиться на другое окно
/не ждать же 20-30 минут окончание переиндексации для большой базы/, то в случае если хотим посмотреть
на какой-стадии идет переиндексация, то конфигуратор уже messages не обновляет.

Попробуйте из класса частями убирать код для того, чтобы определить из-за какой строки теряется фокус.
Как вариант /сходу не скажу как/ запретите переключение на другое окно.

  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #2 - 31. Января 2017 :: 06:34
Печать  
vladimirmir2012 писал(а) 31. Января 2017 :: 06:21:
У 1С это хроническая болезнь.
Если скажем конфигуратор производит переиндексацию, то если переключиться на другое окно
/не ждать же 20-30 минут окончание переиндексации для большой базы/, то в случае если хотим посмотреть
на какой-стадии идет переиндексация, то конфигуратор уже messages не обновляет.

Про проблемы с Конфигуратором мне прекрасно известно. И они никакого отношения к моим проблемам с классом не имеют.

vladimirmir2012 писал(а) 31. Января 2017 :: 06:21:
Попробуйте из класса частями убирать код для того, чтобы определить из-за какой строки теряется фокус.
Как вариант /сходу не скажу как/ запретите переключение на другое окно.

Я же написал, что проблема именно с кодом в классе 1С++. Тот же код в обработке нормально работает.

Насколько я понимаю, проблема обновления главного окна при выполнении кода класса растет оттуда же, откуда проблема с прерыванием выполнения этого кода по ESC. Поэтому ищу помощи именно разработчиков 1С++.
  

FormEx developer
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #3 - 31. Января 2017 :: 13:39
Печать  
АЛЬФ, а ты не пробовал на 1С DisableProcessWindowsGhosting(); натравить?
Кажется это и должно отрубить замерзание окна.
На VC6 вроде как https://www.codeproject.com/Messages/4679309/How-to-use-DisableProcessWindowsGho...
Код (C++)
Выбрать все
typedef void (WINAPI* LPFN_DisableProcessWindowsGhosting)();

HINSTANCE hInst = ::GetModuleHandle(_T("User32"));
if (hInst)
{
    LPFN_DisableProcessWindowsGhosting lpfnFunc =
        (LPFN_DisableProcessWindowsGhosting)::GetProcAddress(hInst, "");
    if (lpfnFunc)
        lpfnFunc();
    else
        TRACE("DisableProcessWindowsGhosting() is not supported\n");
}
 

  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #4 - 31. Января 2017 :: 14:00
Печать  
А как ты обработку класса запускаешь? Пытаюсь... пытаюсь... не хочет замерзать... Из обработки не хочет, из глобальника тоже.
  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #5 - 31. Января 2017 :: 14:01
Печать  
Djelf писал(а) 31. Января 2017 :: 13:39:
АЛЬФ, а ты не пробовал на 1С DisableProcessWindowsGhosting(); натравить?

Первый раз о таком слышу. Завтра попробую.
  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #6 - 31. Января 2017 :: 14:04
Печать  
Djelf писал(а) 31. Января 2017 :: 14:00:
А как ты обработку класса запускаешь? Пытаюсь... пытаюсь... не хочет замерзать... Из обработки не хочет, из глобальника тоже.


Запускаю из обработки. Код в обработке такой:
Код
Выбрать все
Процедура Выполнить()
	СлужебныеФункции = СоздатьОбъект("СлужебныеФункции");
	СлужебныеФункции.ПровестиВзаиморасчеты(НачДата, КонДата, флТолькоВалютные, КомпанияПерепроведения, ВыбДопСоглашение, флТолькоПреференции, флТолькоРСО);
	Сообщить("ВСЕ!");
КонецПроцедуры
 



Реализация класса в текстовом файле. Работает все под 2008-м терминалом.
  

FormEx developer
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #7 - 31. Января 2017 :: 14:31
Печать  
версия 1с++ ?
у меня 3.2.4.2 - при длительной работе кода в методе КОПа не замерзает и ESC работает
  

1&&2&&3
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #8 - 01. Февраля 2017 :: 05:50
Печать  
trad писал(а) 31. Января 2017 :: 14:31:
версия 1с++ ?
у меня 3.2.4.2 - при длительной работе кода в методе КОПа не замерзает и ESC работает

3.2.4.3
И похоже, что дело даже не в длительности кода. Окно перестает обновляться уже после нескольких (до десяти) обработанных документов. Запускаю обработку, дожидаюсь начала вывода сообщений о проводимых документах, перевожу курсор мыши на запущенный Конфигуратор, чтобы всплыло окно подсказки для перехода в приложение (как оно правильно называется?) и в этот момент окно Предприятия перестает обновляться, покрываясь белой дымкой.

  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #9 - 01. Февраля 2017 :: 06:05
Печать  
Djelf писал(а) 31. Января 2017 :: 13:39:
АЛЬФ, а ты не пробовал на 1С DisableProcessWindowsGhosting(); натравить?


Не помогло.
  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #10 - 01. Февраля 2017 :: 06:36
Печать  
Вот набросал класс для тестирования.
http://dorex.pro/files/test.zip

Запускается обработка на выполнение, перевожу курсор мыши на панель задач, чтобы всплыло окошко с приложениями группы. Получаю уход 1С в себя.
  

FormEx developer
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #11 - 01. Февраля 2017 :: 06:58
Печать  
я запускал аналогичный тест.
также сделал тест с перепроводкой документа внутри - тоже ок

правда нет возможности проверить с 2008-м терминалом
  

1&&2&&3
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #12 - 01. Февраля 2017 :: 07:02
Печать  
Скорее всего, это какие-то фишки работы именно под терминалом. У нас тут иногда бывает, что и модальные окна как бы за приложением открываются. Получается, что приложение вроде ждет реакции от пользователя, но окошка этого не видно. Картина зависания в полный рост.
  

FormEx developer
Наверх
www  
IP записан
 
Mink Snopes
Junior Member
**
Отсутствует


bookkeeping considered
harmful

Сообщений: 30
Местоположение: Dombabwe
Зарегистрирован: 05. Ноября 2013
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #13 - 01. Февраля 2017 :: 10:51
Печать  
АЛьФ писал(а) 01. Февраля 2017 :: 06:36:
Вот набросал класс для тестирования.
http://dorex.pro/files/test.zip

Запускается обработка на выполнение, перевожу курсор мыши на панель задач, чтобы всплыло окошко с приложениями группы. Получаю уход 1С в себя.


Подтверждаю на 1c++ 3.2.4.1
Win7 x86 без терминала
Win2003 x64 в терминале

PS. А где брать 1с++ 3.2.4.2 и выше?

На 3.2.4.3 та же фигня.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #14 - 01. Февраля 2017 :: 11:32
Печать  
Mink Snopes писал(а) 01. Февраля 2017 :: 10:51:
Подтверждаю на 1c++ 3.2.4.1
Win7 x86 без терминала

надо тогда сверить "часы" на пустой конфе + 1c++
т.к. у меня на Win7 x86 без терминала - проблем не наблюдаю
  

1&&2&&3
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #15 - 01. Февраля 2017 :: 11:39
Печать  
trad писал(а) 01. Февраля 2017 :: 11:32:
Mink Snopes писал(а) 01. Февраля 2017 :: 10:51:
Подтверждаю на 1c++ 3.2.4.1
Win7 x86 без терминала

надо тогда сверить "часы" на пустой конфе + 1c++
т.к. у меня на Win7 x86 без терминала - проблем не наблюдаю

Создал новую пустую конфигу, прописал в глобальнике запуск 1С++, скопировал в каталог базы тестовый класс из этой ветки. Запустил 1С не монопольно. Запустил обработку. Получил эффект зависания.
  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #16 - 01. Февраля 2017 :: 11:47
Печать  
Проверил на версиях вплоть до самой древней - 1.5. На всех есть эффект подвисания. Так что это не некие доработки последних времен, а проблема базовых принципов вызова класса. Напомню, что при выполнении того же код в обработке зависания не происходит.

upd
Тот же эффект для объекта "ВыполняемыйМодуль".
  

FormEx developer
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #17 - 01. Февраля 2017 :: 12:09
Печать  
Замерзло, подтверждаю. Тот же код внутри ert не замерзает.

upd: и ВМ тоже? ой ой... пошел искать где у меня может что то длительное в ВМ работать...
« Последняя редакция: 01. Февраля 2017 :: 13:12 - Djelf »  
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #18 - 01. Февраля 2017 :: 12:23
Печать  
Для теста в FromEx добавил объект "ВыполняемыйМодуль". Для этого взял из 1С++ ExecuteModule, обрезал все, кроме методов УстановитьМодуль() и КомпилироватьИВыполнитьМодуль() и выполнения указанной процедуры модуля. Вместо CBLModuleWrapper поставил CBLModule7.

Зависания не произошло.
  

FormEx developer
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #19 - 03. Февраля 2017 :: 10:27
Печать  
Я тоже подебил:

кинь текст класса в ert и зависания не будет.
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #20 - 03. Февраля 2017 :: 10:54
Печать  
Вот и вопрос тогда: в чем разница? Контекст?
  

FormEx developer
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #21 - 03. Февраля 2017 :: 11:42
Печать  
АЛьФ писал(а) 03. Февраля 2017 :: 10:54:
Вот и вопрос тогда: в чем разница? Контекст?

Ну да.
Было же, что можно было достучаться и поиметь саму форму класса, если она в ert-нике

http://www.1cpp.ru/docum/icpp/html/classes.html#id32

Вот, из хелпа.
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #22 - 03. Февраля 2017 :: 11:54
Печать  
Eprst писал(а) 03. Февраля 2017 :: 11:42:
АЛьФ писал(а) 03. Февраля 2017 :: 10:54:
Вот и вопрос тогда: в чем разница? Контекст?

Ну да.
Было же, что можно было достучаться и поиметь саму форму класса, если она в ert-нике

http://www.1cpp.ru/docum/icpp/html/classes.html#id32

Вот, из хелпа.


Нет, это вообще из какой-то другой оперы. У меня же класс работает только как класс. Видать при загрузке класса из текста там ставится контекст NULL, а для ert создается контекст формы. Нет времени сейчас уже по исходникам проверять эту мысль (побежал праздновать).
  

FormEx developer
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #23 - 03. Февраля 2017 :: 15:24
Печать  
Поздравляю, АЛьФ!

Еще меняется и поведение объекта Окна - ПослатьКоманду, ОтправитьКоманду и ПриПолученииКомандыГлавнымОкном.
Из обработки сначала обрабатывается событие ОтправитьКоманду, затем ПослатьКоманду, хотя они в коде были в обратном порядке.
А из текста обрабатывается только ОтправитьКоманду, а ПослатьКоманду накапливается и обрабатывается только после завершения кода.

upd:
Окна.ПослатьКоманду(0,0); в цикл
если вызывать часто, замерзания не происходит
если редко, через 5с заморозка, а еще через 15-20с разморозка на 5с
вот такое вот извращение придумал...
« Последняя редакция: 03. Февраля 2017 :: 16:56 - Djelf »  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #24 - 03. Февраля 2017 :: 19:02
Печать  
АЛьФ писал(а) 01. Февраля 2017 :: 06:05:
Djelf писал(а) 31. Января 2017 :: 13:39:
АЛЬФ, а ты не пробовал на 1С DisableProcessWindowsGhosting(); натравить?


Не помогло.

Там по ссылке в коде ошибка, должно быть
(LPFN_DisableProcessWindowsGhosting)::GetProcAddress(hInst, "DisableProcessWindowsGhosting");
Соорудил вк на скорую руку, замерзать перестало, но на esc не реагирует и крестиком не закрывается, что не удивительно т.к. DisableProcessWindowsGhosting так и должно работать.
« Последняя редакция: 03. Февраля 2017 :: 20:13 - Djelf »  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #25 - 04. Февраля 2017 :: 09:37
Печать  
мужики, я размещал коп и в текстовике и в ертшке, один фиг не замерзает.
  

1&&2&&3
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Приложение "не отвечает" при длительном выполнении кода в классе
Ответ #26 - 04. Февраля 2017 :: 11:31
Печать  
trad писал(а) 04. Февраля 2017 :: 09:37:
мужики, я размещал коп и в текстовике и в ертшке, один фиг не замерзает.

Иногда почему то не сразу замерзает. Попробуй на другое окно переключится секунд на 7 или потыкать escape, или крестик завершения ткнуть.
По winspector главное окно получает WS_DISABLED и перекрывается Ghost`овым окном, после этого что-то тыкать снаружи уже бесполезно.
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать