|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.08.2016, 11:09 | #1 |
Пользователь
Регистрация: 27.09.2012
Сообщений: 37
|
Более быстрое заполнение строки
Хотел набить Мемо рандомными символами. Но этот жудкий кодъ жутко тормозит. Если переменную pass задать больше пары тысяч, то это длится очень долго, так как же можно оптимизировать одну строчку кода? Неужели процессору так сложно перебрать несколько тысяч символов?
for i := 0 to pass do begin s:=s+chr(33+random(92)); end; Memo1.Lines[0]:=s; |
02.08.2016, 11:17 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Для s каждый раз память по новой в цикле выделяется. А так:
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
02.08.2016, 11:24 | #3 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
разве так не будет работать? Код:
|
|
02.08.2016, 11:29 | #4 |
Пользователь
Регистрация: 27.09.2012
Сообщений: 37
|
Спасибо, про память не подумал. Да в учебниках Дельфи про это особо не пишут. Это в с++ чуть ли не с первого урока)
|
02.08.2016, 11:33 | #5 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,762
|
И каждую итерацию цикла обращаться к VCL не айс. Лишние тормоза.
Лучше сделать перед циклом Memo1.BeginUpdate и в конце Memo1.EndUpdate; |
02.08.2016, 11:34 | #6 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
02.08.2016, 11:35 | #7 |
Пользователь
Регистрация: 27.09.2012
Сообщений: 37
|
Да вроде не обращаюсь, в цикле ведь только к строке s обращение идёт. А можно как-нибудь отдельный поток выделить? Или это сложная штука?
|
02.08.2016, 12:40 | #8 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Цитата:
для НЕПОСРЕДСТВЕННОГО заполнения memo (Memo1.Text и т.п.) ОБЯЗАТЕЛЬНО придется вернутся в основной поток. Ну не любит VCL (не предусмотрено/ не рекомендуется) работать с доп. потоками. А время заполнения исходной строки если выполнить рекомендации про память и так сократится. В тоже время в потоках никто не запрещает использовать сообщения Windows (PostMessage) и заполнять мемо на основе данного. Осталось разобраться (при желании) что это такое и с чем это едят.
программа — запись алгоритма на языке понятном транслятору
|
|
02.08.2016, 12:58 | #9 | |
Пользователь
Регистрация: 27.09.2012
Сообщений: 37
|
Цитата:
Спасибо, насчёт VCL в потоках я уже прочитал. Потому что поток выделил, а программа всё равно зависшая вся. |
|
02.08.2016, 14:07 | #10 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
я сейчас создал проект. кинул на форму Memo и кнопку. на кнопку назначил код: Код:
Что Вы делаете не так? Или у Вас компьютер старенький и дохленький? |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как осуществить более быстрое выполнение (строки) | Asya7 | Общие вопросы C/C++ | 1 | 12.06.2016 21:52 |
DataGridView не хочет добавлять значения более чем в 3 строки | Konstantin1706 | Windows Forms | 0 | 08.12.2013 15:13 |
Быстрое заполнение таблицы | CrySTaL | Microsoft Office Word | 6 | 24.01.2013 14:03 |
Добавление более одной строки в таблицу | include | SQL, базы данных | 2 | 02.05.2011 19:55 |
Caption на Button в две строки и более | jziiiiiii | Общие вопросы Delphi | 15 | 21.02.2008 17:15 |