Тема: ProcessMessages
Показать сообщение отдельно
  #13 (permalink)  
Старый 06.09.2014, 15:57
Новичок на форуме
Отправить личное сообщение для Владимир_Фомин Посмотреть профиль Найти все сообщения от Владимир_Фомин
 
Регистрация: 06.09.2014
Сообщений: 2

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

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

Браузер Firefox зависнет на целую минуту в Судоку-онлайн для примера 3, пока программа сделает 3 миллиона переборов, а в для примера 46 зависнет на целых 2 минуты, пока программа сделает 9 миллионов переборов.

Вот здесь добавил часы на страничку
sudokut.htm
, и если вы попробуете решить пример 3 или пример 46, то увидите, что во время работы программы часы остановятся.

Скрипт программы.

Подвешивает браузер вот этот код.

function recfrugal(k)
{
  var i;
  var j; 
  var t;
  var q;
  if (k == 82)
  {
    u++;
    for (i = 1; i <= 81; i++) z[i][u] = s[i]
  }
  if ((k <= 81) && (u < 10))
  {
    if ((w[k] == 0) || (w[k] == 1)) recfrugal(k+1);
    if (w[k] > 1)
    {
      for (t = 1; t <= w[k]; t++)
      {
        q = true;
        for (j = 1; j <= 20; j++) if (b[k][t] == s[m[k][j]]) q = false;
        if (q == true)
        {
          s[k] = b[k][t];
          c++;
          recfrugal(k+1);
        }
      }
      s[k] = 0;
      c++;
    }
  }  
}


Что конкретно надо добавить в код программы, чтобы зависание браузера во время длительных вычислений не происходило?

В Паскале (Лазарусе) достаточно было для этого дописать в код функции одну только строчку Application.ProcessMessages

Цитата:
procedure recgen(k: integer; h: integer; g: integer);
var
i: integer;
j: integer;
t: integer;
q: boolean;
begin
Application.ProcessMessages;
if k = size*size + 1
then
begin
u0:=u0+1;
Form2.EditNumberOfSolutions.Text:=IntToStr(u0);
randomize;
randomfield;
for i:=1 to size*size do
if r[i]<=h
then gen[i]:=sg[i]
else gen[i]:=0;
rank(g);
end;
if (k<=size*size) and (stop=false) and (u<>g)
then
begin
randomize;
randomingnumber;
for t := 1 to size do
begin
q := true;
for j := 1 to mc[k] do
if y[t] = sg[m[k, j]]
then q := false;
if (q = true)
then
begin
sg[k] := y[t];
recgen(k+1, h, g);
end;
end;
sg[k] := 0;
end;
end;
А что является аналогом Application.ProcessMessages в javascript?
Ответить с цитированием