Отображение статуса и ProcessMessage

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

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

zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>DevExpress любит баловатся фоновыми задачами, AlphaControls так рисует копки, в том числе и progresbar.
да че там, давай вместо begin\end будем юзать beginThread\endThread

>>главного майнлупа не хватает
не матерись, нельзя на этом форуме.

>>я в свое время ушел от блокировки окон.
>>...
>>Если будет много окон, то обмен данными между ними - уже перерастает в межпроцессорное сообщение.
Вот она вся суть "умного" фанатика.
Ушел за попкорном. пеши есчо
>>Поэтому стал работать с PageControl.
И так быстро слился(( фу
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

olegy123 писал(а):посмотрите исходники таймера, там сидит TThread.

Это где такое? В windows используется встроенный в ОС механизм через SetTimer.
Alex2013 писал(а):То что делается с помощью явных потоков часто просто РУЧНОЕ УПРАВЛЕНИЕ тем, что ОС (и отчасти внутренний "движок" LCL) стараются делать автоматически.

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

Если уж совсем хочется без блокировок (приложения или модальным окном), то стоит позаботиться о пуле с блокировками, к которому окна обращаются, чтобы узнать о статусе документа.
Поток начал работать с документом, сообщил об этом. Поток закончил работать, убрал из пула запись о блокировке, броадкастом оповестил все окна.
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

zub писал(а):>>Каким образом предлагаете блокировать интерфейс (произвольное кол-во окон)?
Гуй ведь у вас на экшенах? если нет - переделать
Менюшки, тулбары, кнопки - штатными средствами экшенов. их можно разрешать-запрещать по ситуации в колбеке. Что там еще - смотреть по ситуации


Такая переделка - это месяца на 3 работы с непредсказуемым результатом :).
Да и не поможет - есть еще и другие события - закрытие окна, реакции на клавиатуру/мышь. На мой взгляд - решение только для простого приложения.

Добавлено спустя 2 минуты 55 секунд:

Код: Выделить всё

if Screen.FormCount >0 then for I:=0 to Screen.FormCount-1 do
if Screen.Forms[i]<> Self then Screen.Forms[i].Close;


Отдельное спасибо. В разы меньше гемора, чем рекурсивно перебирать компоненты главного и т.д. окон.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Результат предсказуем = нормальный гуй. Клавиатура и мышь штатно вписывается в экшены. Вы преукрашиваете ситуацию
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

zub писал(а):Результат предсказуем = нормальный гуй. Клавиатура и мышь штатно вписывается в экшены. Вы преукрашиваете ситуацию

Есть компоненты, в которые заложена штатная реакция на клавиатуру. И вы предлагаете все это перехватывать экшинами?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Я имел ввиду хоткеи экшенов. Компоненты надо смотреть конкретно в каждом случае.
Тут у вас выбор - стандартный лцл механизм или костылики
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

wadman писал(а):Это где такое? В windows используется встроенный в ОС механизм через SetTimer.
не путайте, ваш виндовский SetTimer должен еще засинхронизироватся с главным потоком.

tria писал(а):Отдельное спасибо. В разы меньше гемора, чем рекурсивно перебирать компоненты главного и т.д. окон.
Спасибо Microsoftу за наше счастливое детство..
Сейчас смотрю на подделку таких же спецов, которые накатывали приложение с модальными окошками с заботливо указанием пользователям "подождите, ресурс занят, если ждете долго то позвоните в ИТ отдел", так вот под Wine оно ведет себя по разному не всегда модальное окно модальное.

Добавлено спустя 4 минуты 54 секунды:
tria писал(а):Есть компоненты, в которые заложена штатная реакция на клавиатуру. И вы предлагаете все это перехватывать экшинами?
в системе винды вся работа строится на сообщениях в оконо. Можно перехватывать команды нажатия клавиш и в зависимости от состояния либо их дальше спускать на контролы либо обрабатывать самостоятельно, а контолом нулы давать.

Добавлено спустя 20 минут 30 секунд:
zub писал(а):>>Поэтому стал работать с PageControl.
И так быстро слился(( фу
вся логика строится на Tframe и размещении их на PageControl. PageControl не простой а с кнопочками с иконками, даже есть PopupMenu. Сам рисовал канву. :P
Все Tframe имеют базовый класс Tframe_table и Tframe_form.
В итоге чтобы подключить номенклатуру - мне нужно указать какую таблицу нужно загрузить. Все все остальное делается предками. 1Ска.
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

olegy123 писал(а):аш виндовский SetTimer должен еще засинхронизироватся с главным потоком.

Что тут можно спутать? Приходит сообщение WM_TIMER дополнительному невидимому окну.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Сам рисовал канву.
Надеюсь в отдельном потоке))
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Да, приходилось даже не TThread а более низкоуровневый BeginThread баловаться. Но больше всего с БД, данные грузились в фоне.
Когда форму открываешь, не ждешь когда все загрузятся данные, сразу начинаешь работать. Данные подгружаются по мере закачки. Как в футуристических фильмах.
Ответить