Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2011, 14:52   #1
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию Быстрый вызов метода формы из другого потока

Суть проблемы такова, есть форма выполняющая роль консоли. Для записи текста используется procedure TConsole.Write(const Text: string);
Внутри более менее оптимизация сделана, хотя если будут предложения как сделать быстрее выслушаю. Ну ладно не в этом проблема... этот метод вызываю из другого потока естественно по всем правилам через Synchronize (без него в вообще ни чего не выводится).

Код:
procedure TThreadMachine.SynTextOut(text: string);
begin
 ftext := text;
 Synchronize (TextOut);
end;

procedure TThreadMachine.textout;
begin
 strout(ftext);
end;
как показали замеры скорости сама процедура выполняется быстро покрайней мере падение скорости вывода одного символа и вывода 512 символов максимум несколько микросекунд, (правда как еще с кешем повезет). скорость варьируется от 4500 до 8000 вызовов в сек.

Так вот вопрос: как можно ускорить вызов этого VCL метода? Текст самой процедуры во вложении.
Вложения
Тип файла: txt Console.txt (5.5 Кб, 136 просмотров)
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 21.05.2011, 17:53   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

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

Сейчас вы заставляете TThreadMachine ждать, пока ветка исполнения не переключится на главный поток, пока TConsole не закончит размышлять над переданным ей текстом, пока исполнения не вернётся в дополнительный поток... Смысла в этом практически никакого.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 21.05.2011 в 18:08.
veniside вне форума Ответить с цитированием
Старый 21.05.2011, 18:44   #3
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

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

Цитата:
Из любого потока в любое время, без всяких Syncronize(), очень быстро.
менно так.

Цитата:
проще заюзать TStringList,
В моем контексте очень медленно, уже пробывал, попробуйте в стриг лист добавить 800к записей по 320 байт, у меня это сейчас делается за 0.9 сек.
(хотя меня устроил бы и результат и в 10 раз ниже).

Цитата:
Потом, посылается событие для TConsole (без ожидания результата). В обработчике этого события (это будет уже главный поток) TConsole неспешно читает текст из TStringList, отображает текст на экране и чистит список.
А я и не жду когда это дело будет отрисовываться, я просто ставлю флаг что данные изменились, и в таймере проверяю были ли изменения и только в том случае перерисовываю задний буфер, по требованию формы рисую на ней с этого буфер не трогая данные.

Цитата:
и текст будет быстрей на форме появляться.
меня утраивает что задежка появления текста 0.2 сек.

Цитата:
Сейчас вы заставляете TThreadMachine ждать, пока ветка исполнения не переключится на главный поток, пока TConsole не закончит размышлять над переданным ей текстом, пока исполнения не вернётся в дополнительный поток...
размышления над текстом сейчас почти ни какких (раньше были и время терялось на вызове)

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

В принципе проблема решена, теперь самое узкое место в работе машины это обращение к LPT порту, здесь уже особых ускорений ждать не получится. Железо само по себе медленное.
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 21.05.2011, 20:34   #4
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

насчет стринглиста я ошибался но у него есть одно но он не разбивает строки по символу переводу строки короче не подходит под мою задачу в данном контексте
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ из другого потока Invoke delias C# (си шарп) 17 06.06.2013 22:33
Вызов метода из метода kuzjma PHP 8 10.12.2010 02:38
Использование метода free после завершения потока Denager Общие вопросы Delphi 4 29.08.2008 10:13
Быстрый вызов программы с помощью мыши Патрон Win Api 3 17.07.2008 15:40
Вызов Метода из др. модуля Mickle Общие вопросы Delphi 2 10.05.2007 23:41