[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 240: Undefined array key 1
freepascal.ru форум 2021-01-21T16:06:06+03:00 https://freepascal.ru/forum/app.php/feed/topic/42880 2021-01-21T16:06:06+03:00 2021-01-21T16:06:06+03:00 https://freepascal.ru/forum/viewtopic.php?p=161583#p161583 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
Или это был чисто общий абстрактный совет, не подходящий под данную задачу
э... вроде же работа с инди была? Ничего не понял.
По идее: прежде чем задать вопрос... попробуйте проанализировать то что вы творите. И что хотите получить в ответ. Потом задавайте вопрос и желательно с примером.

А теперь вопрос, что из этого надо помещать в отдельный поток?
работу с базой затолкнуть в поток. Выборка то дело интересное. Может "сразу" ответ получить, а можно и "недельку" подождать.

По поводу "эффектов". Да кто его знает что вы там делаете и как. В теме я увидел только ваши суждения и ребята угадывали что. Пересмотрите свой код (уж коли начали писать то не надо "я не програм.."). Пользуйтесь отладчиком и бубном. Ну и почитайте о реализации многопоточных приложений да и работе с БД в потоках.

п.с.
Теоретически, увидев сорцы, можно было бы что то говорить. Но... смотреть.. то что ваял другой... порой... бывает проще самому написать при адекватном ТЗ. А так: на 10-й странице может кто и угадает что там у вас такого :)

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

И. Весьма интересный вопрос: у вас наблюдаются лаги при запущенном приложении с пустой формой (для приличия накидать компоненты) и без кода? Это по п.2.

Статистика: Добавлено pupsik — 21.01.2021 16:06:06


]]>
2021-01-20T14:03:04+03:00 2021-01-20T14:03:04+03:00 https://freepascal.ru/forum/viewtopic.php?p=161581#p161581 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
olegy123 писал(а):не всегда хорошо, представите вам нужно активно вбивать данные, а тут вам прилетает CriticalSection - и начинаются глюки.

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

Статистика: Добавлено haword — 20.01.2021 14:03:04


]]>
2021-01-19T13:06:45+03:00 2021-01-19T13:06:45+03:00 https://freepascal.ru/forum/viewtopic.php?p=161574#p161574 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
haword писал(а):поток бы запускаясь блокировал бы какой ни будь глобальный лок типа TCriticalSection
не всегда хорошо, представите вам нужно активно вбивать данные, а тут вам прилетает CriticalSection - и начинаются глюки.
CriticalSection - лучше при взаимном межпотковом взаимодействии. Кстати Synchronize это есть CriticalSection только когда главный поток закончил цикл.

jsa писал(а):Запуск TTimer ..порождает отдельный поток TimerThread
Да, поэтому он не точен. Я сейчас не помню, но он точно синхронизируется с главым потоком либо через Synchronize или посылкой PostMessage.

jsa писал(а):почему TTimer не стоит использовать? В чем причина?
он "тяжелый" и предназначен для "визуальных целей" - подсчитать время, сделать часики. Не точен, не монотонный, так как сильно заваязан на GUI. - точность падает с уменьшением интервала.

jsa писал(а):Чем стандартный TTimer отличается от вашего варианта? не могу никак уловить это.
тем что 1) он выполняется вне программы, в ядре windows, отсюда более точен. 2) сделан так чтобы создания и завершения - был о вне программы, и таймер более легкий. Атомарен. ориентирован на мультимедиа, где выполняются жесткие требования по работе.
timeSetEvent/timeKillEvent - все что нужно для запуска и отмены.

Попробуйте запустить заглушить TThread? TThread заглушить не возможно!.. а если нужно делать очень часто?

отличие TThread от timeSetEvent - тем что TThread это полноценны отдельный поток, который затратен на ресурсы и требует отдельное ядро. timeSetEvent - генерирует само ядро, и представлено в виде "события".

Статистика: Добавлено olegy123 — 19.01.2021 13:06:45


]]>
2021-01-18T14:13:40+03:00 2021-01-18T14:13:40+03:00 https://freepascal.ru/forum/viewtopic.php?p=161573#p161573 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
а по коду - постмесэджи я бы не использовал. они могут только своей очередью что то да не так сделать. я бы сделал по другому. каждое событие вызывало бы свой поток с передачей в него параметров. поток бы запускаясь блокировал бы какой ни будь глобальный лок типа TCriticalSection, исполнял бы задачу, закрывался и освобождал бы блокировку. одновременно, с этим в потоке запускал бы таймер ограничивающий длительность работы потока если он завис то вышибал бы его разблокировав блокировку. А оптом бы уже через синхронизацию обновлял данные на форме. Блокировка нужна чтобы не исполнялись зараз несколько запросов к базе а выполнялись бы последовательно. Если критична очередь поступивших сообщений тогда нужен менеджер очереди, который бы выстраивал задания в очередь а другой поток исполнял бы задания из этой очереди. Конечно нужна будет синхронизация потоков, удалять и добавлять данные в очередь только через блокировку и так далее. конечно код стал бы сложнее но думаю более правильный.

Статистика: Добавлено haword — 18.01.2021 14:13:40


]]>
2021-01-18T12:07:37+03:00 2021-01-18T12:07:37+03:00 https://freepascal.ru/forum/viewtopic.php?p=161572#p161572 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
olegy123 писал(а):Короче - вывод такой, прога написана так что не успевает обрабатывать задачи. Сами задачи видимо очень тяжелые - что главный поток не успевает перерисовывать окно.
Проблема в ДНК программиста.

Вывод понятен.
Вопрос только в том как написать так чтобы, программа принимала сообщения, выводила из на форму в Label и при этом успевала открывать данные абонента при одном конкретном типе сообщения.
Т.к. процедуры обращения к базе имеют всегда конкретное не нулевое время работы. То возникает вопрос, существует ли универсальный алгоритм позволяющий принимать и отображать сообщения и данные из базы в режиме реального времени, алгоритм не зависящий от плотности потока сообщений, и размера и загруженности базы.
Получается что такого алгоритма не существует.
Можно только добиться b оптимизировать существующий, для достижения приемлемой работы c потоком сообщений не выше некоторой плотности.
Иначе или выборки данных из базы будут слишком быстро генерироваться и будут возникать накладки. Или же придумывать как пропускать часть сообщений если возникает пробка в обработке.

P.S.
Выпады о проблемах в ДНК я категорически отметаю как суеверные, ибо программистами не рождаются, а становятся, в ДНК такое не прописано, и если я хочу в проблеме разобраться, то это плюс мне в карму, и наезды попрошу попридержать. :)

Добавлено спустя 45 минут 12 секунд:
olegy123 писал(а):TTimer.OnTime - в основе его находется TThread который PostMessage окну на котором он был создан. програ ловит сообщение из очереди и идет выполнять OnTime.

Правильно ли я понял?
Запуск TTimer в момент установки Timer.Enable=true
порождает отдельный поток TimerThread
в этом потоке, запускается счетчик со значением от Interval к 0
В момент наступления значения = 0 поток TimerThread посылает сообщение PostMessage в окно на котором расположен объект TTimer
Основной поток окна получает сообщение в порядке очередности. Т.е. не перебивается текущее выполнение программы, т.е. реально обработка OnTimer может выполняться и чуть позже чем через Interval мс после запуска таймера.
Если первый оператор в обработчике OnTimer это Timer.Enable=false то поток таймера уничтожается/отключается и больше таймер не срабатывает пока он не будет запущен снова событием (изменение данных в поле поиска)?

Теперь вопрос.
Таймер запущен, отсчет уже идет, но событие OnTimer еще не наступило,
И тут срабатывает событие OnChange на TEdit в обработчике снова производятся два действия
Timer.Interval=1000;
Timer.Enable=true;
т.е. счетчик в потоке TimerThread отбрасывается назад к значению Interval
правильно?
Или поток пересоздается, не важно.

Если это так, то не понятно, в чем проблема. почему TTimer не стоит использовать? В чем причина?
он работает себе, т.е. разово запускается, иногда перезапускается до окончания отсчета, после срабатывания отключается и запускает обработку данных. В ОТДЕЛЬНОМ ПОТОКЕ. В основной поток сообщение прилетает 1 раз когда счетчик доберется до 0. При возрастании плотности срабатываний изменения данных в TEdit счетчик таймера В ОТДЕЛЬНОМ потоке так и буедт себе сбрасываться на стартовое значение Interval и таймер не будет срабатывать, пока плотность сообщений не упадет, и изменения на TEdit не станут реже 1000мс.


Чем стандартный TTimer отличается от вашего варианта? не могу никак уловить это.

Добавлено спустя 1 час 44 минуты 27 секунд:
haword писал(а):но в чем прав так это в том что импользовать таймеры отстойно, надо потоки юзать и в них уже обработку делать а не в таймерах.

Я не понял почему использовать таймеры отстойно, можете пояснить смысл?
И что именно надо переносить в Треды?

У меня данный таймер служит только для одной цели, начинать поиск данных в базе только после окончания ввода строки поиска.
Сам поиск это выполнение запроса select со строками из полей поиска в where

Повторюсь, таймер нужен лишь для того чтобы поиск не начинался ДО того как будет введена полная строка например фамилия или номер телефона человека.
Пока пользователь вводит символы задержка между нажатиями клавиш менее 1000мс, и таймер просто перезапускается с каждым нажатием. Это прописано в обработке tEdit.onChange
Как только пользователь ввел строку поиска, таймер больше не сбрасывается в начало отсчета. Отсчитывает 1000мс и срабатывает.
Т.е. запускает select в базу.

Выборка осуществляется в основном потоке и отрисовывается в DBGrid , выборка ограничена Top 50
На DataSource срабатывает onDataChange, ID строки из первого select подается в два других select (это детализация, оба select ограничены top 50 ) которые так же выбирают данные в два других грида.
Обработки изменений на двух датасетах детализации не существует. т.е. дальше каскаком никаких действий нет.
На одном из гридов есть пользовательская отработка отрисовки грида DBGridEhppDrawColumnCell .

А теперь вопрос, что из этого надо помещать в отдельный поток? Или это был чисто общий абстрактный совет, не подходящий под данную задачу.

Статистика: Добавлено jsa — 18.01.2021 12:07:37


]]>
2021-01-16T18:01:09+03:00 2021-01-16T18:01:09+03:00 https://freepascal.ru/forum/viewtopic.php?p=161557#p161557 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
olegy123 писал(а):ну теперь стало ясно..

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

но в чем прав так это в том что импользовать таймеры отстойно, надо потоки юзать и в них уже обработку делать а не в таймерах.

Статистика: Добавлено haword — 16.01.2021 18:01:09


]]>
2021-01-15T22:31:46+03:00 2021-01-15T22:31:46+03:00 https://freepascal.ru/forum/viewtopic.php?p=161551#p161551 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
jsa писал(а):Одна это многопоточный TCP сревер который ловит сообщения и отправляет PostMessage своей же программе.
Вторая ловит и отрабатывает эти сообщения.
И мой основной вопрос был в том правильно ли так делать (вот в этом комментарии viewtopic.php?f=5&t=42880#p161533 )
Так же вызывает недоумение как при этом оказывается влияние на интерфейс другой программы.
Причем только одной этой программы.
Сразу напомню, процессор и память не перегружены.

jsa писал(а):Да это TTimer. Не знаю, что такое одноразовый таймер, но видимо это не он.

:D ну теперь стало ясно..

Как работает программа в среде WIndows? Система Windows сообщает путем посылки PostMessage/SendMessage программе-окну сообщения: изменились размеры, нужно перерисовать, нажата клавиша, мыш пробежала, был клик и т.п.
Программа имеет очередь сообщений, главный поток - берет из очереди следующее сообщения предназначенное ему и идет выполнять: WM_PAINЕ - ага надо перерисовать канву.. WM_SIZING - изменились размеры, нужно перестроить компоненты, WM_KEYDOWN - о, нажата клавиша нужно обновить поле ввода. и т.д
Согласно документации MSDN WinAPI в среде Windows Так работает программа написанная на С++,C#,Qt,Python,VB прочее которые делают окошко в windows, они обязаны делать обработчики событий. Иначе никакая кнопка не кликнет, текст не пишется..
И в Delphi/Lazarus такое есть, только оно спрятано за компонентами и они реализуют сами этот функционал. Что будет если в TButton.OnClick засунуть бесконечный цикл и нажать на него? А будет то что главный(оконный) поток словит WM_CLICK и пойдет выполнять OnClick и там зависнет - оконное приложение тоже.

Программа не может одновременно обработать все сообщения сразу.. все идет по порядку согласно очереди сообщения.
Что будет если мы начнет забивать своими сообщениями PostMessage/SendMessage окно?

TTimer.OnTime - в основе его находется TThread который PostMessage окну на котором он был создан. програ ловит сообщение из очереди и идет выполнять OnTime.

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

Добавлено спустя 20 минут 15 секунд:
А теперь код как я обещал:

Код:

uses mmsystem;

     procedure OnChange(Sender: TObject);
  private
    FTimerOnShot:Cardinal;

procedure TimerSearch(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
  PostMessage(dwUser,WM_MyRefresh,0,0)
end;
procedure TForm1.OnChange(Sender: TObject);
begin
    timeKillEvent(FTimerOnShot);
    FTimerOnShot:=timeSetEvent(1000,1,@TimerSearch,Handle,TIME_ONESHOT);
end;

Тут запуск таймера который только один раз стреляет, 1000 - это 1сек, то есть через 1сек стартует TimerSearch, но если до этого будет изменения то timeKillEvent(FTimerOnShot); убъет предыдущий тамер и перезапустит заново timeSetEvent. Вызов низкоуровневый, на уровне ядрышка системы Windows.

Добавлено спустя 24 минуты 6 секунд:
jsa писал(а):Влиять может частая избыточная перерисовка компонент окна. Так получается.
Еще перегрузка главного потока, который необходим для взаимодействия с операционной системой.
Если есть трудоемкие задачи - их нужно выносить в отдельные потоки.

TThread
procedure Execute
Synchronize
вполне достаточно для понимания чтобы дополнительные ядрышки процессора включились в работу.
Synchronize - нужно чтобы главный поток немного отдохнул и можно было поработать вместо него, допустим вывести результат вычисления.

Статистика: Добавлено olegy123 — 15.01.2021 22:31:46


]]>
2021-01-15T11:47:11+03:00 2021-01-15T11:47:11+03:00 https://freepascal.ru/forum/viewtopic.php?p=161544#p161544 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Буду знать, что смыла лезть нет. Всего доброго!

Статистика: Добавлено Seenkao — 15.01.2021 11:47:11


]]>
2021-01-15T11:12:02+03:00 2021-01-15T11:12:02+03:00 https://freepascal.ru/forum/viewtopic.php?p=161543#p161543 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
Seenkao писал(а):И уж точно ни кто не будет копаться в вашем коде (особенно если он большой) чтобы найти вашу проблему.

Я вас услышал, конкретно в вашей помощи не нуждаюсь, потому что скорее всего её в принципе не будет в любом случае.
Спасибо.

Статистика: Добавлено jsa — 15.01.2021 11:12:02


]]>
2021-01-15T11:46:05+03:00 2021-01-15T11:02:06+03:00 https://freepascal.ru/forum/viewtopic.php?p=161542#p161542 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено Seenkao — 15.01.2021 11:02:06


]]>
2021-01-15T08:32:43+03:00 2021-01-15T08:32:43+03:00 https://freepascal.ru/forum/viewtopic.php?p=161541#p161541 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
Seenkao писал(а):
Seenkao писал(а):Посредством чего выводится изображение на экран?
я уже задавал вопрос, а в этом вопросе и ответ.

Не понимаю вопроса. И не вижу в нем никакого ответа.
Что значит посредством чего? Монитора? Видеокарты? Драйверов? Я не профессиональный программист, самоучка, и видимо не в теме.
Но, если используется LCL, то вероятно совпадают хендлы? (как это вообще возможно, если система сама присваивает им номера).

Совпадают хендлы в разных программах? Это вообще возможно? и то что в скобках это ответ самому себе? Просто рассуждения вслух? Или зачем этот вопрос тут?

Добавлено спустя 17 минут 48 секунд:
Seenkao писал(а):Возможны частые Sleep в программе (от них вообще в Windows лучше избавляться, если что-то критично по времени работы, так как это не стабильная задержка когда равна 1-й мс, может вылиться в 16 мс). Где-то цикл обработки, из которого нет выхода из-за каких-то случайно попавших туда данных. Где-то создание динамического массива, который не удаляется после того, как уже не нужен. Где-то излишний массив/данные, которые не используются, но при этом захламляют память.

Нет
Нет
Нет
...
Вы читали то, что я написал выше? Я привел текст процедур которые экспериментально определил как место в котором происходит возникновение эффекта.

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

Нет. Эффект проявлется в релизной сборке.

Тут ни когда не угадаешь что у вас происходит.
Вы не предоставили ни чего! Абсолютно!

Гадать не надо, я спрашиваю совета, а не гадания.
И говорить что я ничего не предоставил, очень странно, весь проект никто выкладывать не будет, в две процедуры которые вызывают эффект я привел выше. Так что ваше пафосное восклицание - "Абсолютно!", выглядит очень странно.

Где логи программы, которые должны выводиться, если вы отлаживаете свою программу?

Я рад советам. Например про логи, это какие именно логи имеются ввиду? Виндовые, какие-то логи Lazarus-а? Или я должен в своей программе сбрасывать логи на диск во время работы?
Я думал об этом, только мне не понятно как организовать логи в месте которое виснет скорее всего из-за какой-то накладки рабоыт потоков с интерфейсом, если сама запись в файл это такое же прерывание как и прорисовка интерфейса или выборка данных из базы.

jsa писал(а):но Lazarus продолжил тасовать окна проекта по циклу, не дорисовывая их.
вот вы ответили на свой вопрос, у вас в памяти работает цикл, который постоянно перерисовывает формы. А что это за цикл?

Где я ответил на свой вопрос?
О каком цикле вы спрашиваете? Вы вообще читаете то, что написано, или по первым словам в предложении проскакиваете?
В этом конкретном месте я упоминал поведение НЕ своей программы, а Lazarus-а который иногда срывается в эффект подобный тому как ведут себя мои целевые программы.
Это не мой программный цикл, и я тут никак НЕ ответил на свой вопрос.
Это глюк поведения Lazarus в не зависимости от любого проекта.
И я выше привел ссылку на видеозапись этого поведения Lazarus.

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

Нет это не так.
Все описанные проблемы с двумя целевыми программами, происходят на exe-шиках запускаемых из проводника по отдельности. На разных системах.
Win8 на VBox6.1, Win7 на железе, WinServ2019 в терминале, Win10 на железе.

P.S.
Возможно я зря в одной теме описал два похожих но в разных места проявляющихся эффекта. Некоторые путают.
--- ответы Seenkao --- end ---



--- ответы olegy123 --- begin ---
Добавлено спустя 9 минут 20 секунд:
olegy123 писал(а):
jsa писал(а):Спам через 5-10 минут примерно начинает вызывать подтормаживание второй программы на которую влияет ПР.
через 15-18 минут после старта спама вторая программа виснет, и в "Диспетчере задач" обозначена как "Не отвечает"
146% неправильный код. Который замедляет главный поток программы, он же в свою очеред не может ответить операционной системе на вызовы - та считает что програ подвисла.

Это понятно, что не правильный.
Я привел выше две процедуры который вызывают эффект.
Одна это многопоточный TCP сревер который ловит сообщения и отправляет PostMessage своей же программе.
Вторая ловит и отрабатывает эти сообщения.
И мой основной вопрос был в том правильно ли так делать (вот в этом комментарии viewtopic.php?f=5&t=42880#p161533 )
Так же вызывает недоумение как при этом оказывается влияние на интерфейс другой программы.
Причем только одной этой программы.
Сразу напомню, процессор и память не перегружены.

Добавлено спустя 29 минут 33 секунды:
olegy123 писал(а):Что за Таймер? можно код? Если TTimer - то это зло, у него работа синхронизирована с главным потоком.
Таймер - одноазовый с изменяемой по времени отсрочкой активации?

Да это TTimer. Не знаю, что такое одноразовый таймер, но видимо это не он.
Им я решаю проблему преждевременной выборки данных при наборе пользователем слова в строке поиска.
Т.к. событие TEdit.onChange срабатывает при вводе каждого символа.
То на этом событии я не делаю запуск выборки в базе, а запускаю конкретный таймер на N мс например 1000, если до срабатывания таймера пользователь вводит еще один символ то таймер снова запускается со значения N
когда же таймер срабатывает то уже в его событии OnTime запускается выборка данных.
В проблемных процедурах, я получаю строку поиска в сообщении и вставляю ее в TEdit (вызов процедуры FormCallCntr.FindPatWithPhoneExecute(FormCallCntr); ) , и дальше запускается таймер.

Код:

procedure TFormCallCntr.FindPatWithPhoneExecute(Sender: TObject);
begin
     LEditPhone.Text:=PhoneNum;
     LEditFam.Text:=''; LEditFam.Font.Style:=[];
     LEditIm.Text:='';  LEditIm.Font.Style:=[];
     LEditOt.Text:='';  LEditOt.Font.Style:=[];
     RButtonEMCpat.Checked:=false; RButtonEMCpat.Checked:=true;
end;     

После вставки срабатывают события onChange на строках поиска, и запускается таймер.
Текст таймера.

Код:

---про неправильную передачу параметров в текст запроса, просьба не комментировать, я вкурсе, еще не везде в проекте исправил
procedure TFormCallCntr.TimerFindPatTimer(Sender: TObject);
begin
     TimerFindPat.Enabled:=false;
     if  RButtonEMCPat.Checked then
         begin
         Select_Pat.Close;
         Select_Pat.SQL.Clear;
         Select_Pat.SQL.Text:=Select_PatSQLText;
         if (LEditFam.Text='') and (LEditIm.Text='') and (LEditOt.Text='') and (LEditPhone.Text='')
            then Select_Pat.SQL.Add('where ID=0')
            else begin
                 Select_Pat.SQL.Add('where isnull(Fam,'+#39+#39+') like '+#39+'%'+LEditFam.Text+'%'+#39);
                 Select_Pat.SQL.Add('and isnull(Im,'+#39+#39+') like '+#39+'%'+LEditIm.Text+'%'+#39);
                 Select_Pat.SQL.Add('and isnull(Ot,'+#39+#39+') like '+#39+'%'+LEditOt.Text+'%'+#39);
                 Select_Pat.SQL.Add('and isnull(Phone,'+#39+#39+') like '+#39+'%'+LEditPhone.Text+'%'+#39);
                 end;
         Select_Pat.Open;
         end;
     FormCallCntr.ChangePatExecute(Sender); --- запуск выборки в двух других зависимых от Select_pat таблицах
end;   


Добавлено спустя 11 минут 35 секунд:
olegy123 писал(а):нет SendMessage - заморозит работу.

Попробовал, так и вышло, SendMessage (сообщение с ожиданием ответа) усугубило проблему в разы. Вернул PostMessage.

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

Может я не верно понимаю как работает TTimer
Я предполагаю, что запуске таймера например на 1000мс запускается отсчет который никак не завязан с основным потоком, не зависит от него и не влияет на него.
Если ДО срабатывания таймера, снова установить интервал = 1000мс то он просто начнет отсчитывать период с этой точки , и опять это никак не влияет на работу основного потока программы.
Таким образом я могу вносит задержку срабатывания на ввод строк в произвольном количестве TEdit, в итоге таймер сработает один раз после окончания ввода во всех строках поиска TEdit (если оператор расторопный и задержка не маленькая для него).
Правильно?
Или такую задержку надо организовывать по другому, без использования TTimer ?

Добавлено спустя 3 минуты 39 секунд:
olegy123 писал(а):
jsa писал(а):Думаете, что общий проблемный ресурс тут видеопамять? Тогда почему только 2 программы, одна написанная на Lazarus и другая не Delphi имеют такие проблемы?

делфи/лазарус работает поверх системных вызовов, так что все кнопки поля ввода - это стандартные windows элементы. Если конечно не рисуете их самостоятельно в графике - канве или в OpenGL/DX.

Получается что торможение моей программы само по себе не может повлиять на "стандартные windows элементы" и через это на другую программу написанную на Delphi.
Влиять может частая избыточная перерисовка компонент окна. Так получается.

Добавлено спустя 13 минут 52 секунды:
olegy123 писал(а):У меня глюки были с любой серьезной программой если вместо нормальных дров стояли windows или стандартный VGA.

Я тоже сначала на драйвера думал.
Но потом стало выясняться что проблема проявляется на разных ОС, в разных условиях, на разном железе и в виртуалках.
olegy123 писал(а):
jsa писал(а):Win8 на виртуальной машине VirtualBox 5.2.28
тогда понятно, там дефолтно идет драйвер режима VGA, нужно как минимум включать 2D режим.

Уточняю сейчас уже больше года Win8 стоит на VBox6.1 режим включен VBoxSVGA
И режима 2D в Vbox уже нету.

olegy123 писал(а):Это VirtualBox? Значит нужны VirtualBox Guest Additions для Windows 10 там есть
"Выбор компонентов VirtualBox GuestAdditions для Windows 10. Вы можете выбрать поддержку ускорения 3D графики." Которой Windows 8/Windows 10 очень необходимы так как интерфейс весь написан на Direct2D.

Да на видео это VBox6.1 и на нем Win8 VirtualBox Guest Additions на нем конечно стоит.
Но так как Win8 стоит давно, а VirtualBox Guest Additions я похоже не обновлял после обновления Linux Mint и может быть не обновлял VirtualBox Guest Additions после последнего обновления VBox, то они устарели.
Поддержку 3D графики никогда не включал. Включал только 2D пока она была в VBox
На всякий случай включил 3D и переустановил VirtualBox Guest Additions
После этого запуск Дельфовой программы в процессе её загрузки вызывал закрытие окна гостевой ОС .
Два раза подрят.
После перезагрузки хостовой Linux Mint , гостевая больше не обрушивалась.
Интерфейс винды стал вроде более шустрым. И подтормаживания при прорисовке перегруженных элементами форм стали меньше.
Спасибо за совет.
--- ответы olegy123 --- end ---

Добавлено спустя 16 минут 1 секунду:
На данный момент пока проблему решил так.
Оставил в процедуре вызываемой PostMessage только индикацию сообщений на форме.
Запуск поиска и выборки из базы убрал, и поместил на кнопку.
В режиме только индикация, гонял 1,5 часа входящие сообщения с рандомной задержкой 0-1 сек.
Интерфейс моей программы ПР на лазарусе никак не подвисал. Интерфейс прогарммы на Delphi тоже ведет себя стабильно, некоторая задержка отрисовки некоторых окон видна, но несущественно.
Конечно если спамить вообще без задержек, то тогда ПР виснет. Но такого в реальной работе не будет.
Но с вопросом всё равно нужно разобраться.

Статистика: Добавлено jsa — 15.01.2021 08:32:43


]]>
2021-01-14T09:43:07+03:00 2021-01-14T09:43:07+03:00 https://freepascal.ru/forum/viewtopic.php?p=161540#p161540 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
jsa писал(а):Спам через 5-10 минут примерно начинает вызывать подтормаживание второй программы на которую влияет ПР.
через 15-18 минут после старта спама вторая программа виснет, и в "Диспетчере задач" обозначена как "Не отвечает"
146% неправильный код. Который замедляет главный поток программы, он же в свою очеред не может ответить операционной системе на вызовы - та считает что програ подвисла.

jsa писал(а):А вот callin_connect производит запись номера телефона в поле поиска в интерфейсе программы. После записи срабатывает событие OnChange в нем производится запуск таймера.
Таймер отсчитывает период задержки после ввода (сделано для того чтобы дать время пользователю набрать в поле поиска слово целиком).
Что за Таймер? можно код? Если TTimer - то это зло, у него работа синхронизирована с главным потоком.
Таймер - одноазовый с изменяемой по времени отсрочкой активации?

Добавлено спустя 3 минуты 21 секунду:
jsa писал(а):Возможно вместо PostMessage нужно использовать SendMessage .
нет SendMessage - заморозит работу. Тут важно чтобы таймер сработал один раз и только после ввода последнего знака.
У меня есть пример, но покажу попоже.

Добавлено спустя 3 минуты 29 секунд:
jsa писал(а):Думаете, что общий проблемный ресурс тут видеопамять? Тогда почему только 2 программы, одна написанная на Lazarus и другая не Delphi имеют такие проблемы?

делфи/лазарус работает поверх системных вызовов, так что все кнопки поля ввода - это стандартные windows элементы. Если конечно не рисуете их самостоятельно в графике - канве или в OpenGL/DX.

Добавлено спустя 4 минуты 52 секунды:
SSerge писал(а):так вот, достаточно часто после работы этой программы появлялся похожий эффект - либо любая программа на lazarus/delphi начинала запускаться с окном, в котором ничего не отрисовано, либо запускалась вглухую: висит где-то в памяти, а видимых окон нет. И так до перезагрузки операционной системы. Кстати, такое поведение было одним из весомых поводов прекратить писанину на лазарусе вообще.
У меня глюки были с любой серьезной программой если вместо нормальных дров стояли windows или стандартный VGA.

Добавлено спустя 1 минуту 44 секунды:
jsa писал(а):Win8 на виртуальной машине VirtualBox 5.2.28
тогда понятно, там дефолтно идет драйвер режима VGA, нужно как минимум включать 2D режим.

Добавлено спустя 9 минут 6 секунд:
jsa писал(а):Думаю что причины те же.
https://yadi.sk/i/_EmEmjCbrOd2BQ

Это VirtualBox? Значит нужны VirtualBox Guest Additions для Windows 10 там есть
"Выбор компонентов VirtualBox GuestAdditions для Windows 10. Вы можете выбрать поддержку ускорения 3D графики." Которой Windows 8/Windows 10 очень необходимы так как интерфейс весь написан на Direct2D.

Статистика: Добавлено olegy123 — 14.01.2021 09:43:07


]]>
2021-01-14T09:05:10+03:00 2021-01-14T09:05:10+03:00 https://freepascal.ru/forum/viewtopic.php?p=161539#p161539 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
jsa писал(а):Я вот думаю как может одна программа влиять на отрисовку другой программы, и при этом не затрагивать больше никаких других


В 2008-м примерно, наталкивался на старый нелокализованный (т.е. причину достоверно установить не удалось) глюк RTL лазаруса, выражавшийся в следующем:
- Windows XP;
- Программа с единственной формой, в которой кнопки и TMemo, работающая с длительными задержками - т.е. пока считает, форма не отвечает, и это где-то минута - две.

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

Статистика: Добавлено SSerge — 14.01.2021 09:05:10


]]>
2021-01-15T11:45:34+03:00 2021-01-13T13:49:01+03:00 https://freepascal.ru/forum/viewtopic.php?p=161537#p161537 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено Seenkao — 13.01.2021 13:49:01


]]>
2021-01-13T13:25:30+03:00 2021-01-13T13:25:30+03:00 https://freepascal.ru/forum/viewtopic.php?p=161536#p161536 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
jsa писал(а):Кстати сейчас вот поймал такой очень редкий глюк Lazarus всего раза три такое видел за несколько лет.

в терминальной сессии у меня и на делфи такое бывает

Статистика: Добавлено haword — 13.01.2021 13:25:30


]]>
2021-01-13T12:58:34+03:00 2021-01-13T12:58:34+03:00 https://freepascal.ru/forum/viewtopic.php?p=161535#p161535 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
haword писал(а):когда начинаются глюки оперативка случайно не забивается полностью? нет нагрузки на винт большой? может утечка какая то идет и после определенного времени программа заполняет всю выделенную под нее память и начинает гнать все вокруг.

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

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


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

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

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

Нет, один и тот же.

Статистика: Добавлено jsa — 13.01.2021 12:58:34


]]>
2021-01-15T11:44:40+03:00 2021-01-13T12:35:58+03:00 https://freepascal.ru/forum/viewtopic.php?p=161534#p161534 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено Seenkao — 13.01.2021 12:35:58


]]>
2021-01-13T12:27:55+03:00 2021-01-13T12:27:55+03:00 https://freepascal.ru/forum/viewtopic.php?p=161533#p161533 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Спам через 5-10 минут примерно начинает вызывать подтормаживание второй программы на которую влияет ПР.
через 15-18 минут после старта спама вторая программа виснет, и в "Диспетчере задач" обозначена как "Не отвечает"
ПР при этом не обозначена как "Не отвечает" но интерфейс тоже висит.
Т.е. место определено правильно.

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

Думаю причина в том как именно запускается обработка сообщений.
Возможно вместо PostMessage нужно использовать SendMessage .

Статистика: Добавлено jsa — 13.01.2021 12:27:55


]]>
2021-01-13T11:49:58+03:00 2021-01-13T11:49:58+03:00 https://freepascal.ru/forum/viewtopic.php?p=161532#p161532 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено haword — 13.01.2021 11:49:58


]]>
2021-01-15T11:44:59+03:00 2021-01-13T09:59:31+03:00 https://freepascal.ru/forum/viewtopic.php?p=161531#p161531 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено Seenkao — 13.01.2021 09:59:31


]]>
2021-01-13T05:48:07+03:00 2021-01-13T05:48:07+03:00 https://freepascal.ru/forum/viewtopic.php?p=161530#p161530 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено jsa — 13.01.2021 05:48:07


]]>
2021-01-12T18:18:41+03:00 2021-01-12T18:18:41+03:00 https://freepascal.ru/forum/viewtopic.php?p=161528#p161528 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено Alex2013 — 12.01.2021 18:18:41


]]>
2021-01-12T12:19:09+03:00 2021-01-12T12:19:09+03:00 https://freepascal.ru/forum/viewtopic.php?p=161526#p161526 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> По поводу ситуации №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 — 12.01.2021 12:19:09


]]>
2020-01-06T12:11:25+03:00 2020-01-06T12:11:25+03:00 https://freepascal.ru/forum/viewtopic.php?p=158006#p158006 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено DYUMON — 06.01.2020 12:11:25


]]>
2020-01-04T17:06:35+03:00 2020-01-04T17:06:35+03:00 https://freepascal.ru/forum/viewtopic.php?p=157991#p157991 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Сегодня опять экран 2 раза становился белым, во время работы в Lazarus

Статистика: Добавлено jsa — 04.01.2020 17:06:35


]]>
2020-01-03T06:30:25+03:00 2020-01-03T06:30:25+03:00 https://freepascal.ru/forum/viewtopic.php?p=157988#p157988 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
olegy123 писал(а):Даже малая память ОЗУ и активная работа с своп памятью может замедлить работу самой виндовс.
Если в программе нет тяжелых и долгих расчетов - то очень сложно сказать.

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

Для ОЗУ отвел 8Гб,
отключил 3D ускорение
и на видеопамять выделил 256Мб.
Эффект пока не проявлялся.

Статистика: Добавлено jsa — 03.01.2020 06:30:25


]]>
2019-12-25T19:41:56+03:00 2019-12-25T19:41:56+03:00 https://freepascal.ru/forum/viewtopic.php?p=157897#p157897 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
jsa писал(а):2.
У заказчиков, стоит Win Server 2019
на нем терминальный сервер. В сессии...

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

Статистика: Добавлено sts — 25.12.2019 19:41:56


]]>
2019-12-25T19:04:14+03:00 2019-12-25T19:04:14+03:00 https://freepascal.ru/forum/viewtopic.php?p=157894#p157894 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]>
jsa писал(а):Периодически экран становится белым, потом на нем прорисовываются компоненты окон.
Такие фокусы могут быть когда окно(любое приложения, написанное на любом языке) не обрабатывает сообщения о перерисовке окна, или не успевает обработать все сообщения. простой бесконечный цикл, или наоборот блокировка главного потока может приводить к таким фокусам с перерисовкой. Хотя не исключено что сама винда не успевает перерисовывать.. как правило вские 3D/Video окна используют overlay/DMA режимы - но это вопросы к винде/драйверам. Даже малая память ОЗУ и активная работа с своп памятью может замедлить работу самой виндовс.
Если в программе нет тяжелых и долгих расчетов - то очень сложно сказать.

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

Статистика: Добавлено olegy123 — 25.12.2019 19:04:14


]]>
2019-12-25T14:57:00+03:00 2019-12-25T14:57:00+03:00 https://freepascal.ru/forum/viewtopic.php?p=157890#p157890 <![CDATA[Re: Странные эффекты в Win8, WinServer2019]]> Статистика: Добавлено Снег Север — 25.12.2019 14:57:00


]]>
2019-12-25T07:18:39+03:00 2019-12-25T07:18:39+03:00 https://freepascal.ru/forum/viewtopic.php?p=157887#p157887 <![CDATA[Странные эффекты в Win8, WinServer2019]]>
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 — 25.12.2019 07:18:39


]]>