Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.05;
Скачать: CL | DM;

Вниз

ожидание выполнения процедуры   Найти похожие ветки 

 
nord   (2011-02-24 21:10) [0]

Здравствуйте!
Как можно узнать выполнилась ли вызываемая процедура и ожидать пока она этого не сделает?
Просто в обычном варианте расчеты в процедуре не успевают полностью "просчитаться" и программа идет дальше по тексту, что нарушает ход работы...
Пробовал поставить флаг, но походу он тоже игнорится самими расчетами..

Спасибо


 
Palladin ©   (2011-02-24 21:15) [1]

Какие ваши доказательства?


 
KilkennyCat ©   (2011-02-24 21:16) [2]

вообще-то, управление программе передается по завершению вызванной процедуры, в точку вызова.

что-то не договариваешь.


 
nord   (2011-02-24 22:03) [3]

в этой части программы происходит загрузка текстового файла, обработка его и запись обратно
обработка и осуществляется процедурой и представляет собой простейшую шифровку вида

str:="";
   for i:=1 to length(memoLogg2.Text)do
   begin
   if i mod 2 =0 then kk:=ord(memoLogg2.text[i])+(i mod 7)*2 else
   kk:=ord(memoLogg2.text[i])+i mod 10;
   repeat
   if kk>255 then kk:=kk-255;
   if kk<1 then kk:=kk+255;
   until (kk>0)and(kk<256);
   str:=str+chr(kk);
   end;
memoLogg.Text:=str;

и эта конструкция в коде не успевает полностью выполняться.. как-то глючно получается... стоит искать проблему в другом месте? просто если вместо этих преобразований записать просто не обработку, а копирование текста из одного мемо в другое:
memoLogg.Text:=memoLogg2.Text
то все идет без проблем, причем текст может быть внушительных размеров, тогда как при шифровании происходит сбой очень быстро...
сама функция шифрования верна, написана в отдельной программе для проверки и работает замечательно, разве что заметна задержка при большом объеме информации..


 
KilkennyCat ©   (2011-02-24 22:14) [4]


> заметна задержка

ну еще бы:

>  for i:=1 to length(memoLogg2.Text)


это:

> repeat
>    if kk>255 then kk:=kk-255;
>    if kk<1 then kk:=kk+255;
>    until (kk>0)and(kk<256);

тоже упрощается.


 
nord   (2011-02-24 22:18) [5]

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


 
KilkennyCat ©   (2011-02-24 22:19) [6]


> for i:=1 to do
>    begin
>    if i mod 2 =0

я бы заменил на
ln := length(memoLogg2.Text);
i := 0;
if ln > 2 then
 repeat
   inc(i,2)
.....
 until ... i >= ln;


 
KilkennyCat ©   (2011-02-24 22:23) [7]


> так как они есть гораздо хуже моего,

не в данном случае.

в любом случае, надо сразу писать нормально, эмуляция "плохого" компа через плохой код - это глупо.

str - лишняя.

но в любом случае, есть некоторая недоговоренность.
приведенный код не объясняет вопроса.


 
Игорь Шевченко ©   (2011-02-24 22:37) [8]

ужос

не прще ли взять строку и работать с ней, а не дергать каждый раз memo.text ? Или хотя бы представлять, что за этим вызовом стоит.


 
Игорь Шевченко ©   (2011-02-24 22:37) [9]

шифровальщики недоделанные


 
sniknik ©   (2011-02-24 22:49) [10]

> str - лишняя.
да как сказать... скорее лишнее все остальное...


 
KilkennyCat ©   (2011-02-24 22:58) [11]


> sniknik ©   (24.02.11 22:49) [10]

да, наверное. я вообще наошибался. неудобно читать, неформатно.


 
nord   (2011-02-24 23:01) [12]

=)))))
ну простите)) программа не какая не ответственная - чисто пример для себя же.. шифрование чисто условное.. текст не предполагается большой - буквально один абзац.. в общем все чисто условное.. я согласен что код хреновый, да! цель на данном этапе минимальна, поэтому код не вылизывался.. а я просто спросил про возможную проблему в ожидании выполнения процедуры.. если и правда в этом проблемы быть не может, то спасибо, буду смотреть в других местах, хотя уже и так вроде все пересмотрено..

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


 
Юрий Зотов ©   (2011-02-24 23:12) [13]

> nord   (24.02.11 21:10)  

> Как можно узнать выполнилась ли вызываемая процедура и ожидать пока
> она этого не сделает?

Если не порождаются вторичные потоки, то ничего специального не требуется.
вызов_процедуры;
следующая_строка_кода;

Когда начнет выполняться следующая_строка_кода, то это и будет означать, что выполнение процедуры полностью закончилось.

> расчеты в процедуре не успевают полностью "просчитаться" и программа
> идет дальше по тексту, что нарушает ход работы...

Этого не может быть (если, конечно, не порождаются вторичные потоки).


 
nord   (2011-02-24 23:22) [14]

понятно, спасибо)


 
Anatoly Podgoretsky ©   (2011-02-25 10:28) [15]

Приведеный текст не может выполниться не полностью.


 
KilkennyCat ©   (2011-02-25 13:03) [16]


> Anatoly Podgoretsky ©   (25.02.11 10:28) [15]

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


 
Anatoly Podgoretsky ©   (2011-02-25 13:34) [17]

> KilkennyCat  (25.02.2011 13:03:16)  [16]

Пусть ждет когда включат, или пусть UPS купит, а не жалуется.


 
abb777 ©   (2011-02-26 22:44) [18]

свои 2 коп позволю снбе вставить:

str:=str+chr(kk);

Так никогда не надо делать, если заранее известно, какой длины в конце концов будет строка. Как в данном случае.

Надо:

SetLength(str, length(memoLogg2.Text))
.................
str[i] := chr(kk);

А вылететь недоработав до конца, может только по исключению. Попробовать окружить вызов процедуры try...except и посмотреть, что будет. Хотя, откуда там исключения...



Страницы: 1 вся ветка

Текущий архив: 2011.06.05;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1298064597
Юрий
2011-02-19 00:29
2011.06.05
С днем рождения ! 19 февраля 2011 суббота


10-1156496750
фыва
2006-08-25 13:05
2011.06.05
OleContainer и ScrollBar


15-1297841206
И. Павел
2011-02-16 10:26
2011.06.05
Явамастер


15-1297838969
DiamondShark
2011-02-16 09:49
2011.06.05
Тулзы для Оракла


2-1298780760
filimonic
2011-02-27 07:26
2011.06.05
Как заблокировать кнопку Пуск в Windows 7