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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2016, 11:09   #1
diomed16
Пользователь
 
Регистрация: 27.09.2012
Сообщений: 37
По умолчанию Более быстрое заполнение строки

Хотел набить Мемо рандомными символами. Но этот жудкий кодъ жутко тормозит. Если переменную pass задать больше пары тысяч, то это длится очень долго, так как же можно оптимизировать одну строчку кода? Неужели процессору так сложно перебрать несколько тысяч символов?


for i := 0 to pass do
begin
s:=s+chr(33+random(92));
end;
Memo1.Lines[0]:=s;
diomed16 вне форума Ответить с цитированием
Старый 02.08.2016, 11:17   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для s каждый раз память по новой в цикле выделяется. А так:
Код:
MaxLen:=10000;
SetLength(s,MaxLen);
for i := 1 to pass do
begin
  s[i]:=chr(33+random(92));
end;
Memo1.Lines[0]:=Copy(s,1,pass);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.08.2016, 11:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
MaxLen:=10000;
SetLength(s,MaxLen);
простите, не понял, а зачем выделять больше, чем нужно?!

разве так не будет работать?
Код:
SetLength(s,pass+1);
for i := 1 to pass do
  s[i]:=chr(33+random(92));
Memo1.Text:=Copy(s,1,pass);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2016, 11:29   #4
diomed16
Пользователь
 
Регистрация: 27.09.2012
Сообщений: 37
По умолчанию

Спасибо, про память не подумал. Да в учебниках Дельфи про это особо не пишут. Это в с++ чуть ли не с первого урока)
diomed16 вне форума Ответить с цитированием
Старый 02.08.2016, 11:33   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

И каждую итерацию цикла обращаться к VCL не айс. Лишние тормоза.
Лучше сделать перед циклом Memo1.BeginUpdate и в конце Memo1.EndUpdate;
FaTaL вне форума Ответить с цитированием
Старый 02.08.2016, 11:34   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
зачем выделять больше, чем нужно
Из предположения, что не одна строка в мемо пишется и длины разные. Один раз выделить и забыть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.08.2016, 11:35   #7
diomed16
Пользователь
 
Регистрация: 27.09.2012
Сообщений: 37
По умолчанию

Да вроде не обращаюсь, в цикле ведь только к строке s обращение идёт. А можно как-нибудь отдельный поток выделить? Или это сложная штука?
diomed16 вне форума Ответить с цитированием
Старый 02.08.2016, 12:40   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
А можно как-нибудь отдельный поток выделить? Или это сложная штука?
можно-то можно. НО!
для НЕПОСРЕДСТВЕННОГО заполнения memo (Memo1.Text и т.п.) ОБЯЗАТЕЛЬНО придется вернутся в основной поток. Ну не любит VCL (не предусмотрено/ не рекомендуется) работать с доп. потоками.
А время заполнения исходной строки если выполнить рекомендации про память и так сократится.

В тоже время в потоках никто не запрещает использовать сообщения Windows (PostMessage) и заполнять мемо на основе данного. Осталось разобраться (при желании) что это такое и с чем это едят.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.08.2016, 12:58   #9
diomed16
Пользователь
 
Регистрация: 27.09.2012
Сообщений: 37
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
можно-то можно. НО!
для НЕПОСРЕДСТВЕННОГО заполнения memo (Memo1.Text и т.п.) ОБЯЗАТЕЛЬНО придется вернутся в основной поток. Ну не любит VCL (не предусмотрено/ не рекомендуется) работать с доп. потоками.
А время заполнения исходной строки если выполнить рекомендации про память и так сократится.

В тоже время в потоках никто не запрещает использовать сообщения Windows (PostMessage) и заполнять мемо на основе данного. Осталось разобраться (при желании) что это такое и с чем это едят.

Спасибо, насчёт VCL в потоках я уже прочитал. Потому что поток выделил, а программа всё равно зависшая вся.
diomed16 вне форума Ответить с цитированием
Старый 02.08.2016, 14:07   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от diomed16 Посмотреть сообщение
Спасибо, насчёт VCL в потоках я уже прочитал. Потому что поток выделил, а программа всё равно зависшая вся.
что-то Вы не договариваете или вводите нас в заблуждение...

я сейчас создал проект.
кинул на форму Memo и кнопку.
на кнопку назначил код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
 i, pass, MaxLen : integer;
begin
pass:=10000;
SetLength(s,pass+1);
for i := 1 to pass do
  s[i]:=chr(33+random(92));
Memo1.Text:=Copy(s,1,pass);
end;
выполняется меньше секунды.

Что Вы делаете не так? Или у Вас компьютер старенький и дохленький?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как осуществить более быстрое выполнение (строки) 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