Как запустить поток для фрейма?
В отдельном модуле имею TfrUn = class(TFrame) в нём есть TMemo, в нём очень большой обработчик действий, которые в свою очередь оказывают влияние на другие элементы этого фрейма и основного модуля (Обработчик обрабатывает все изменения в TMemo, перебирает все строки при любом изминении). Но как таковой переменной в фрейме frUn: TfrUn; не объявляется.
В основном модуле есть pcProg: TPageControl; в нём динамически создаю страницу и создаю экземпляр объект типа TfrUn, вновь созданную страницу назначаю родителем для вновь созданного TfrUn. Т. е. на каждой странице свой фрейм с TMemo у которой свои обработчики событий.
И вот когда в TMemo много строк прога начинает тупить. Хочу для каждого вызова обработчика TMemo запускать поток.
Вот мне и не снятся с ручника. Если запускать поток и в Execute вызывать этот обработчик, дак в модуле фрейма конкретно переменной frUn нет и я не могу обратится из Execute к обработчику TfrUn.
В общем я упёрся. Помогите, люди добрые.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
17-12-2024 05:58
Как я понимаю, TMemo получает данные от пользователя? Тогда есть как минимум несколько вариантов для оптимизации:
1. Запускать обработчик не сразу по вводу данных от пользователя, а по некоторой задержке. Например, 500мс. Понятно, что время задержки зависит от типа данных и может даже меняться в зависимости от ряда параметров (например, мы выяснили, что при фильтрации через 300мс обработчик всё-равно прерывается через 400мс, что говорит о том, что пользователь просто сам тупит и надо таймаут увеличивать... какое условие, по которому можно будет уменьшать таймаут я не придумал, так что он просто сбрасывается в настройку по умолчанию при перезапуске приложения).
2. TMemo это не самоцель, а хранилище данных. Потому, он фактически хранит String, или TStrlingList, если менее общно. Так что можно по таймауту вычитывать этот string/TStringList, отдавать его потоку, чтобы тот начинал работать. Ну а если придёт новая пачка данных, а предыдущая ещё не будет обработана - тогда прерывать ранее запущенный поток, создавать новый и ему передавать новую пачку данных.
19-11-2024 10:05 | Вопрос к автору: запрос дополнительной информации
>>> Если запускать поток и в Execute вызывать этот обработчик, дак в модуле фрейма конкретно переменной frUn нет и я не могу обратится из Execute к обработчику TfrUn.
Насколько я понимаю, вам нужно из "дополнительного потока", обратиться к Memo в основном (синхронизовать данные). При этом, не изменяя, ни класса "дополнительного потока", ни "основного"?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.