Странные эффекты в Win8, WinServer2019

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Странные эффекты в Win8, WinServer2019

Сообщение jsa » 25.12.2019 06:04:49

Эффекты разные но мне кажется, что суть у них одна.

1.
Win8 на виртуальной машине VirtualBox 5.2.28
Работаю над любым проектом в Lazarus 1.8.0
Периодически экран становится белым, потом на нем прорисовываются компоненты окон.
раз в 3-4 таких "вылета" экрана в белое, винда вообще вылетает в экран приветствия закрывая сессию (все программы).
Такое поведение появилось не сразу. Причем винду не обновляю никогда. А в Lazarus периодически ставлю компоненты.
Если Lazarus не запущен, то проблема не проявляется вообще никогда.

Есть идеи в чем причина?

2.
У заказчиков, стоит Win Server 2019
на нем терминальный сервер. В сессии rdp запускаются 2 программы. Одна написана на Delphi (не мой проект, версию не знаю), другая это мой проект на Lazarus 1.8.0
Запущенные в сессии эти программы по отдельности работают отлично, прорисовка окон и закладок практически моментальная.
Но стоит их запустить обе, начинается трэш. В обеих программах. Кнопки прорисовываются сек по 2 каждая, по очереди. Ресайз формы, или панели превращается в мельтешение, из рамок объектов, потом мельтешение устаканивается и начинается медленная прорисовка внутри рамок объектов (форм, кнопок и т.д.)

Если начать переключаться между этими двумя программами, то происходит наложение недорисованных компонент одного и другого окна. Их видно одновременно.
происходит быстро и не стабильно, поэтому скриншот пока не сделал.

Часто (2 раза да день) одна из программ просто вылетает. Закрывается без сообщений программы, и без сообщений винды.

Есть идеи в чем причина?

Добавлено спустя 2 часа 13 минут 50 секунд:
Вторая проблема похожа на эту https://sysadmins.ru/topic481121.html
Только проблема с 1С7.7 на WinServ2012 передам админам пусть ковыряют.

А вот с 1й не понятно.
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

Re: Странные эффекты в Win8, WinServer2019

Сообщение Снег Север » 25.12.2019 15:57:00

Мой хрустальный шар говорит, что самая вероятная причина - драйвер видеокарты на клиентском компе.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2717
Зарегистрирован: 27.11.2007 16:14:47

Re: Странные эффекты в Win8, WinServer2019

Сообщение olegy123 » 25.12.2019 20:04:14

jsa писал(а):Периодически экран становится белым, потом на нем прорисовываются компоненты окон.
Такие фокусы могут быть когда окно(любое приложения, написанное на любом языке) не обрабатывает сообщения о перерисовке окна, или не успевает обработать все сообщения. простой бесконечный цикл, или наоборот блокировка главного потока может приводить к таким фокусам с перерисовкой. Хотя не исключено что сама винда не успевает перерисовывать.. как правило вские 3D/Video окна используют overlay/DMA режимы - но это вопросы к винде/драйверам. Даже малая память ОЗУ и активная работа с своп памятью может замедлить работу самой виндовс.
Если в программе нет тяжелых и долгих расчетов - то очень сложно сказать.

jsa писал(а):Но стоит их запустить обе, начинается трэш.
нужно смотреть на объем ОЗУ + своп.
Попроуй запустить Android Studio и серьезный растовый редактор на 2ГБ оперативы - скриншоты и пошаговая стратегия начинается..
olegy123
долгожитель
 
Сообщения: 1613
Зарегистрирован: 25.02.2016 12:10:20

Re: Странные эффекты в Win8, WinServer2019

Сообщение sts » 25.12.2019 20:41:56

jsa писал(а):2.
У заказчиков, стоит Win Server 2019
на нем терминальный сервер. В сессии...

возникла версия о посылке широковещательных виндовых событий или получение неверных хендлов окон и посылок на них сообщений, такое возможно в новых версиях винды, они там мутят разные вариации изменений.
т.е. одна программа посылает сообщения хендлам окон другой вместо своих.
какбы проверить... замените проги на другие и посмотрите - сохранятся глюки или нет, например даблкоммандер вместо той которая на лазарусе.
sts
постоялец
 
Сообщения: 295
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Странные эффекты в Win8, WinServer2019

Сообщение jsa » 03.01.2020 07:30:25

olegy123 писал(а):Даже малая память ОЗУ и активная работа с своп памятью может замедлить работу самой виндовс.
Если в программе нет тяжелых и долгих расчетов - то очень сложно сказать.

В виртуалке было 6гб оперативки и 128Мб на видео память

Для ОЗУ отвел 8Гб,
отключил 3D ускорение
и на видеопамять выделил 256Мб.
Эффект пока не проявлялся.
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

Re: Странные эффекты в Win8, WinServer2019

Сообщение jsa » 04.01.2020 18:06:35

Нет не решена проблема.
Сегодня опять экран 2 раза становился белым, во время работы в Lazarus
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

Re: Странные эффекты в Win8, WinServer2019

Сообщение DYUMON » 06.01.2020 13:11:25

может имена форм сделать отличные от form1, form2, form3
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 222
Зарегистрирован: 11.03.2009 13:32:54

Re: Странные эффекты в Win8, WinServer2019

Сообщение jsa » 12.01.2021 13:19:09

По поводу ситуации №2.

Снег Север писал(а):Мой хрустальный шар говорит, что самая вероятная причина - драйвер видеокарты на клиентском компе.

Тут видимо не одна, а несколько наслоившихся проблем.
И с видеокартой в том числе. Но проблема стала проявляться на компах с Win7, Win8, и не в виртуальном или терминальном режимае, на обычной ОС установленной на железо.
проявляется через продолжительное время работы, минут через 30-50.

olegy123 писал(а):Такие фокусы могут быть когда окно(любое приложения, написанное на любом языке) не обрабатывает сообщения о перерисовке окна, или не успевает обработать все сообщения. простой бесконечный цикл, или наоборот блокировка главного потока может приводить к таким фокусам с перерисовкой.

Есть подозрение на обработку сообщения от АТС по TCP

Эта программа (далее ПР) получает сообщение от службы которая считывает события с АТС и рассылает по экземплярам ПР на разных рабочих местах сообщение по TCP
Для этого используются компоненты Indy10

Вот код.
Я не знал как "отвязать" однопоточную IdTCPServer от основного интерфейса ПР
поэтому сделал через посылку сообщения программой самой себе.

Код: Выделить всё
//Обработка сигнала по TCP от службы ATEx
procedure TFormCallCntr.IdTCPServerATExExecute(AContext: TIdContext);
var strMsg, Callid, pn, cmd:string; p:integer;
begin
     //Принимаем от клиента строку
     cmd:=''; Sleep(10);
     strMsg := AContext.Connection.Socket.ReadLn;
     //Обработка
     p:=pos('|',strMsg);
     if p<>0 then
        begin
        //разделение полученной строки на ID звонка и номер телефона
        cmd:=LowerCase(copy(strMsg,1,p-1));  //CallID:=copy(strMsg,1,p-1);
        strMsg:=copy(strMsg,p+1,length(strMsg)-p);
        p:=pos('|',strMsg);
        if p<>0 then
           begin
           CallID:=copy(strMsg,1,p-1);
           pn:=copy(strMsg,p+1,length(strMsg)-p);  if pn<>'???' then PhoneNum:=pn;
           end
           else PhoneNum:=strMsg;
        PhoneNum:=formatNumPhone( PhoneNum );
        Sleep(10);
        if cmd='callin_start'    then PostMessage(Handle, Msg_PhoneVisible, 0, 0);
        if cmd='callin_connect'  then PostMessage(Handle, Msg_PhoneVisible, 1, 0);
        if cmd='callin_stop'     then PostMessage(Handle, Msg_PhoneVisible, 2, 0);
        if cmd='callout_start'   then PostMessage(Handle, Msg_PhoneVisible, 3, 0);
        if cmd='callout_connect' then PostMessage(Handle, Msg_PhoneVisible, 4, 0);
        if cmd='callout_stop'    then PostMessage(Handle, Msg_PhoneVisible, 5, 0);
        Sleep(10);
        end;
end;               


Тут объявление процедуры, есть и другие процедуры обработки сообщений, но они практически не используются.
Код: Выделить всё

const
     MessExePrm1=WM_USER;
     MessExePrm2=WM_USER+1;
     Msg_PhoneVisible=WM_USER+3;

....

  private
    { private declarations }
    procedure PhoneVisibleExec(var Msg: TMessage); message Msg_PhoneVisible;
    procedure RangeDateChange(Sender: TObject);
    procedure WMACT(var mes:TWMACTIVATE); message WM_ACTIVATE;
  public
    { public declarations }
    procedure ReadMessExePrm1(var MessExePrm1:TMessage); message MessExePrm1;
    procedure ReadMessExePrm2(var MessExePrm2:TMessage); message MessExePrm2;
  end; 



Обработка сообщения от IdTCPServer во всех случаях просто меняет видимость индикаторов на панели программы.
В одном случае запускает обработку номера телефона полученного от АТС - запись номера в фильтр и перевыборку цепочки Select-ов с DBGridEh на формах.
Код: Выделить всё

//Переключение индикатора звонка телефона
procedure TFormCallCntr.PhoneVisibleExec(var Msg: TMessage);
var prm:integer;
begin
     prm:=Msg.Wparam;
     if prm=0 then //Включить индикатор телефона / Начало звонка DIAL_STATUS='callin_start'
        begin
        PanelPhone.Visible:=true;
        ImagePhone.Visible:=false; ImageBtnInsertPhone.Visible:=true; ImageBtnOutPhone.Visible:=false;
        LabelPhoneExternal.Font.Color:=clMaroon;
        LabelPhoneExternal.Caption:='Вам звонят - '+PhoneNum;
        TimerPhone.Interval:=100; TimerPhone.Enabled:=fl_flashing_phone_indicator;
        end;
     if (prm=1) or (prm=4) then //Включить индикатор телефона / Начало разговора DIAL_STATUS='connect'
        begin
        PanelPhone.Visible:=true;
        ImagePhone.Visible:=true; ImageBtnInsertPhone.Visible:=false; ImageBtnOutPhone.Visible:=false;
        LabelPhoneExternal.Font.Color:=clGreen;
        if (prm=1) then LabelPhoneExternal.Caption:='Вы говорите с '+PhoneNum;
        if (prm=4) then LabelPhoneExternal.Caption:='Вы дозвонились - '+PhoneNum;
        TimerPhone.Interval:=0; TimerPhone.Enabled:=false;
        FormCallCntr.FindPatWithPhoneExecute(FormCallCntr);
        end;
     if (prm=2) or (prm=5) then //Выключить индикатор телефона / Звонок полностью окончен  DIAL_STATUS:='stop'
        begin
        PanelPhone.Visible:=false;
        TimerPhone.Interval:=0; TimerPhone.Enabled:=false;
        SBtnCallout_start.Visible:=true;
        end;
     if prm=3 then //Включить индикатор телефона / Начало звонка DIAL_STATUS='callout_make'
        begin
        PanelPhone.Visible:=true;
        ImagePhone.Visible:=false; ImageBtnInsertPhone.Visible:=false; ImageBtnOutPhone.Visible:=true;
        LabelPhoneExternal.Font.Color:=clMaroon;
        LabelPhoneExternal.Caption:='Вы звоните на номер '+LEditPhone.text;
        TimerPhone.Interval:=100; FormCallCntr.TimerPhone.Enabled:=fl_flashing_phone_indicator;
        end;
end;   


По идее, т.к. в один экземпляр ПР прилетают сообщения касающиеся только событий происходящих в одним внутренним номером телефонной сети, то они должны быть более мнее последовательными, и очень редко может возникать ситуация когда, предыдущее еще не отработано-не отрисовано, и уже пришло очередное. Но возможно такое случается, при высокой плотности звонков и большом количестве людей-операторов работающих одновременно.

Например может быть такая череда сообщений.

callin_start|1231|9119116789
callin_stop|1239|9119116789
callin_start|1245|9519512345
callin_stop|1266|9519512345
callin_start|3346|9019019874
callin_connect|3377|9019019874
callin_stop|3489|9019019874
....


Sleep(10) - не было, добавил по рекомендации (хотя советовали IndySleep но похоже в IndyLaz его нет)

Так же в книге "Indy in depth" вычитал рекомендацию
В Indy имеется специальный компонент, который решает проблему замораживания
пользовательского интерфейса. Просто добавьте один компонент TIdAntiFreeze куда ни будь в
своем приложении, и вы сможете выполнять блокирующие вызовы без замораживания
пользовательского интерфейса. Использование TIdAntiFreeze позволяет получить все преимущества блокирующих сокетов, без
видимых недостатков.


Тестирование того повлияло ли прерывание Sleep и IdAntiFreeze еще предстоит.

Основной вопрос. Правильно ли вообще так делать, так обрабатывать внешние сообщения для индикации событий?
Если нет то как лучше делать?
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

Re: Странные эффекты в Win8, WinServer2019

Сообщение Alex2013 » 12.01.2021 19:18:41

Lazarus 1.8.0 одна из достаточно неудачных сборок ( даже Lazarus 1.8.4 лучше.)
Alex2013
долгожитель
 
Сообщения: 1961
Зарегистрирован: 03.04.2013 11:59:44

Re: Странные эффекты в Win8, WinServer2019

Сообщение jsa » 13.01.2021 06:48:07

Поправка, я уже давно перешел на Lazarus 2.0.8
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

Re: Странные эффекты в Win8, WinServer2019

Сообщение Seenkao » 13.01.2021 10:59:31

.
Последний раз редактировалось Seenkao 15.01.2021 12:44:59, всего редактировалось 1 раз.
Seenkao
постоялец
 
Сообщения: 206
Зарегистрирован: 01.04.2020 03:37:12

Re: Странные эффекты в Win8, WinServer2019

Сообщение haword » 13.01.2021 12:49:58

когда начинаются глюки оперативка случайно не забивается полностью? нет нагрузки на винт большой? может утечка какая то идет и после определенного времени программа заполняет всю выделенную под нее память и начинает гнать все вокруг.
haword
постоялец
 
Сообщения: 294
Зарегистрирован: 02.03.2006 11:34:40

Re: Странные эффекты в Win8, WinServer2019

Сообщение jsa » 13.01.2021 13:27:55

Написал программу которая спамит в цикле проблемную программу ПР, спамит сообщениями с рандомной задержкой 0-2 сек.
Спам через 5-10 минут примерно начинает вызывать подтормаживание второй программы на которую влияет ПР.
через 15-18 минут после старта спама вторая программа виснет, и в "Диспетчере задач" обозначена как "Не отвечает"
ПР при этом не обозначена как "Не отвечает" но интерфейс тоже висит.
Т.е. место определено правильно.

Дальше определил тип сообщения все кроме одного типа - callin_connect работают не вызывая проблемы, потому что в процедуре
procedure PhoneVisibleExec(var Msg: TMessage); message Msg_PhoneVisible;
они производят только пару изменений в интерфейсе.
А вот callin_connect производит запись номера телефона в поле поиска в интерфейсе программы. После записи срабатывает событие OnChange в нем производится запуск таймера.
Таймер отсчитывает период задержки после ввода (сделано для того чтобы дать время пользователю набрать в поле поиска слово целиком).
Когда таймер срабатывает то производится поиск человека по номеру в базе.
Видимо именно эта последовательность действий, через некоторое количество итераций начинает накладываться сама на себя, и вызывает тормоза интерфейса.

Думаю причина в том как именно запускается обработка сообщений.
Возможно вместо PostMessage нужно использовать SendMessage .
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

Re: Странные эффекты в Win8, WinServer2019

Сообщение Seenkao » 13.01.2021 13:35:58

.
Последний раз редактировалось Seenkao 15.01.2021 12:44:40, всего редактировалось 1 раз.
Seenkao
постоялец
 
Сообщения: 206
Зарегистрирован: 01.04.2020 03:37:12

Re: Странные эффекты в Win8, WinServer2019

Сообщение jsa » 13.01.2021 13:42:47

haword писал(а):когда начинаются глюки оперативка случайно не забивается полностью? нет нагрузки на винт большой? может утечка какая то идет и после определенного времени программа заполняет всю выделенную под нее память и начинает гнать все вокруг.

Процессор занят обеими программами занят не более чем на 12% каждой.
памяти занимают по 25-35 Мб.
Это больше чем в обычном режиме работы, но не похоже на полный забив ресурсов.

Добавлено спустя 6 минут 55 секунд:
Seenkao писал(а):Всё свидетельствует, что захламляется видеопамять (возможно и общая память, что ещё хуже) делайте ллогирование. Отключайте части программ и смотрите что с собой несёт такую нагрузку.
В общем, проблема не описана и не было попытки её решить. (как я вижу)


Я вот думаю как может одна программа влиять на отрисовку другой программы, и при этом не затрагивать больше никаких других.
Думаете, что общий проблемный ресурс тут видеопамять? Тогда почему только 2 программы, одна написанная на Lazarus и другая не Delphi имеют такие проблемы?

Кстати не две, а уже три.
Кстати сейчас вот поймал такой очень редкий глюк Lazarus всего раза три такое видел за несколько лет.
Думаю что причины те же.
https://yadi.sk/i/_EmEmjCbrOd2BQ
Две проблемные программы были запущены. я запустил Lazarus и получил такой эффект.
Закрыл две проблемные программы, но Lazarus продолжил тасовать окна проекта по циклу, не дорисовывая их.

Добавлено спустя 8 минут 52 секунды:
Seenkao писал(а):Таймера? Каждый раз нового?

Нет, один и тот же.
jsa
постоялец
 
Сообщения: 188
Зарегистрирован: 28.11.2017 13:46:04

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 17

Рейтинг@Mail.ru