Re: Викторина для 5 версии
Добавлено: 20:43, 20.09.2010
кидаете файл с базой вопросов, желательно от этой викторины, в папку pluginsdata, затем сам плагин кидаете в папку плагинс и запускаете плагин в клиенте
ты на других не смотриcilvay писал(а):А создателю, написавшему плагин замены активного процесса и версии программы, бана не надо?
Под вайном тормозит ужасно. Ответило на вопрос, а тем временем прошло уже три другихcilvay писал(а):кидаете файл с базой вопросов, желательно от этой викторины, в папку pluginsdata, затем сам плагин кидаете в папку плагинс и запускаете плагин в клиенте
Нее, Я думаю это значит, что алгоритм не оптимальныйcilvay писал(а):все происходит исключительно в оперативной памяти. Просто вайну до винды еще очень далеко...
А можешь в кратце обрисовать как всё происходит?cilvay писал(а):если честно, то балуюсь. Под вайн подгонять не собираюсь, тк с алгоритмом все впорядке и под эмулятор подстраиваться нет смысла. Думая дальше можно будет накрутить всяких рандомных задержек, пропусков и т.д.
text:=utext;
delete(text,14,length(text));
delete(text,1,7);
if text='ВОПРОС' then
begin
KillTimer(Form1.Handle,1);
vobr:=utext;
delete(vobr,1,15);
vobr:=Parse('(',vobr,1);
delete(vobr, length(vobr)-1, 2);
form1.memo2.lines.add('Вопрос до обработки: '+vobr);
if (vobr[length(vobr)]='.') or (vobr[length(vobr)]='?') then
vobr:=vobr else
vobr:=vobr+'.';
form1.memo2.lines.add('Обработанный вариант: '+vobr);
for i := 0 to form1.Memo1.Lines.Count - 1 do
begin
vs:=parse('|',form1.Memo1.Lines,1);
if vs=vobr then
begin
form1.memo2.lines.add('Ответ найден');
if random(form1.SpinEdit2.Value)=0 then begin
form1.memo2.lines.add('Вывод ответа будет пропущен');
end else begin
rch:=form1.SpinEdit3.Value+random(form1.SpinEdit1.Value);
form1.memo2.lines.add('Ответ будет выведен через: '+inttostr(rch)+' миллисекунд');
otv:=parse('|',form1.Memo1.Lines,2);
//sleep(tt);
SetTimer(Form1.Handle,1,rch,@Timer);
end;
end;
end;
Думаю проблема именно из-за Memo. Почему именно его выбрал как хранилище базы, а не массив?cilvay писал(а):Вот так:Код: Выделить всё
for i := 0 to form1.Memo1.Lines.Count - 1 do begin vs:=parse('|',form1.Memo1.Lines[i],1); if vs=vobr then begin // skip end; end;
TMemo.Lines это класс TMemoStrings. при обращении к Lines мы попадаем в функциюcilvay писал(а):Мне мемо кажется удобнее. Тем более в win системах весь текст в мемо хранится в памяти. А на вайне он видимо как кеш на жестком диске
Код: Выделить всё
function TMemoStrings.Get(Index: Integer): string;
var
Text: array[0..4095] of Char;
begin
Word((@Text)^) := Length(Text);
SetString(Result, Text, SendMessage(Memo.Handle, EM_GETLINE, Index,
Longint(@Text)));
end;
Если в этом случае использовать ассоциативный массив, в котором ключём будет вопрос, а значением ответ, то выборку можно производить без цикла, а прямым обращением с проверкой на существование. (понятно, что какой-то цикл будет, но он будет внутри и он, наверное, оптимизирован до нельзя)cilvay писал(а):Мне мемо кажется удобнее.
А на вайне он видимо как кеш на жестком диске
Вот и я говорю, что надо бы какую-то структуру другую использовать. Ведь мемо, оно для вывода в форме, вроде как. Т.е. назначение иное.-=SJ=- писал(а): Как видим чтобы запросить строку у мемо - ему посылается winapi сообщение EM_GETLINE что никак нельзя назвать оптимальным.
Так как Wine это не нативная среда для winapi то отсюда и тормоза.
Лучше использовать не Memo.Lines а хотя бы TStringList вот там действительно будет все в памяти крутится и никаких проволочек не будет.