Возникла необходимость задержать выполнение скрипта до того момента, пока не будет выполнено некоторое условие, устанавливаемое извне. Проблема в том, что пока скрипт ждет, должны выполняться и другие функции в этом скрипте. Например:
window.setInterval("some_code", 50);
while (!some_condition) { processMessages(); }
В этом случае some_code через некоторое время производит установку some_condition в true, но срабатывание таймера не происходит, потому как вместо processMessages у меня сейчас ничего не стоит, поэтому скрипт зависает.
Спасибо, я прочитал, идея с showModalDialog весьма нестандартная и главное, рабочая, но вот как только скрыть это окно? я заводил его далеко-далеко, а оно всё равно видно...
BK>Спасибо, я прочитал, идея с showModalDialog весьма нестандартная и главное, рабочая, но вот как только скрыть это окно? я заводил его далеко-далеко, а оно всё равно видно...
А хрен его знает... Похоже оно не скрывается с пределов экрана.
Есть еще пара мыслей по этому поводу, но это уже будет совершенный изврат. Да и неудобно это...
нужно искать другую функцию, которая блокирует поток в контексте текущей функции...
BK>>Спасибо, я прочитал, идея с showModalDialog весьма нестандартная и главное, рабочая, но вот как только скрыть это окно? я заводил его далеко-далеко, а оно всё равно видно...
DSD>А хрен его знает... Похоже оно не скрывается с пределов экрана.
а в принципе, это окно можно превратить в часть интерфейса, например, как в моём случае, писать "Загрузка исходных данных..." ну а что делать, надо же недостатки в достоинства превращать... DSD>Есть еще пара мыслей по этому поводу, но это уже будет совершенный изврат.
Например? DSD>нужно искать другую функцию, которая блокирует поток в контексте текущей функции...
боюсь, что кроме showModalDialog, такой нет...
Здравствуйте, Bob Kotl, Вы писали:
BK>Здравствуйте, DSD, Вы писали:
DSD>>А хрен его знает... Похоже оно не скрывается с пределов экрана. BK>а в принципе, это окно можно превратить в часть интерфейса, например, как в моём случае, писать "Загрузка исходных данных..." ну а что делать, надо же недостатки в достоинства превращать... DSD>>Есть еще пара мыслей по этому поводу, но это уже будет совершенный изврат. BK>Например?
Например, попытаться управлять окном диалога из него самого. типа window.moveTo()
в любом случае(кроме твоего) диалоги — это не очень удобно, т.к. для открытия диалога один хрен приходится грузить страницу с сервера, что не удобно для создания паузы...
DSD>>нужно искать другую функцию, которая блокирует поток в контексте текущей функции... BK>боюсь, что кроме showModalDialog, такой нет...
я видел на сайте MS кучу примеров для работы с разными ActiveX-обьектами, "разрешенными" в IE, т.е. теми, которые запускаются без предупреждений безопасности.
Например, был какой-то, типа DirectAnimation или DirectAudio...
в них еще надо покопаться, может и удастся выудить какую-либо функцию, которая происходит с задержкой в текущем контексте...
Вообщем я нашел решение этой проблемы, которое мне подошло. Нужен СОМ объект с одним методом:
STDMETHODIMP CProba::Delay(LONG count)
{
MSG msg;
for (int i=0;i<count;i++)
{
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
::DispatchMessage(&msg);
}
return S_OK;
}
Использование:
while (!some_condition) { obj.Delay(2);}
Проблемы на сколько я понимаю 2:
1.) Вопрос при первой загрузке сайта типа: "На этой странице есть ActiveX... хотите ли вы его установить? " Или что-то в этом роде.
2.) Размер СОМ объекта(с ATL) ~40 кил. Правда качать его придется только один раз.
В моем проекте ни одна из этих проблем не актуальна, поэтому я с этим особенно не заморачивался, однако есди сильно надо, 2-ю проблему можно несколько уменьшить(раз так в 10), если писать не используя ATL, а если писать компоненту на ассемблере(вроде такое тоже можно), то видимо еще раз в 10 меньше получится.
Здравствуйте, Nikto, Вы писали:
N>Вообщем я нашел решение этой проблемы, которое мне подошло. Нужен СОМ объект с одним методом:
ActiveX'ы мы уже давно обсуждали — это не выход.
Здравствуйте, DSD, Вы писали:
DSD>Здравствуйте, Nikto, Вы писали:
N>>Вообщем я нашел решение этой проблемы, которое мне подошло. Нужен СОМ объект с одним методом: DSD>ActiveX'ы мы уже давно обсуждали — это не выход.
Во-первых кому как . Во-вторых суть в том что если ты напишешь вместо этого кода в методе например Sleep(n), то у тебя ничего работать не будет...