Всем добрый вечер. Столкнулся с проблемой. Необходимо организовать задержку в цикле на определеной время ( скажем 10 секунд ). Как мне это сделать, но без использования Sleep, SleepEx, CreateEvent + WaitForSingleObject да SetTimer тоже не подходит. Вобщем чтобы поток не останавливался. Буду рад любой помощи. Мучаюсь уже который день. Заранее спасибо.
ни разу за 10 сек конечно не получится - слишком грандозная бессонница в многоздачной среде ) а так сверяйся периодически например с GetTickCount.
Partner Потому что в это время потоке выполняется выполняется другой код. Поток нельзя остановить ( т.к. остановится выполнение другого когда ). Но и в другой поток этот код не запихнуть ( не работает в другом потоке ). Нужно чтобы код отработал. И при этом была задержка цикла. В коде асинхронные функции. Вот такая вот проблема.
Вобщем примерно так: for(i=0;i<5;i++) { do{ сдесь задержка ( 5-10 секунд ) }while(x!=1) асинхронная функция }
trust Это называется "стой там иди сюда". В одном потоке невозможно одновременное выполнение кода в двух местах. Асинхронная функция по определению выполняется в другом потоке. Иначе она никакая не асинхронная.
Partner Может быть я не прав (с асинхронностью ). Но просто необходимо чтобы эта функция отработала нормально. Для этого нужно реализовать задержку, как я схематически изобразил.
trust то что ты нарисовал реализуется через sleep ) Другое дело если 10 сек делаешь что-то полезное, затем вызываешь свою "асихронную" функцию и продолжаешь выполнение программы - тут поможет GetTickCount.
Partner Вот тебе примерная задача. Если ты работал с COM. for(i=0;i<5;i++) { do{ сдесь задержка ( 5-10 секунд ) }while(x!=1) IWebBrowser::Navigate(); x--; } Ловлю событие через DWebBrowserEvents2 и присваиваю x единицу. Ну а потом проверяю этот x. Потому что без задержки отработает только последня функция в цикле ( из-за особенности Navigate() ). А если задержку делать через Sleep(). То сами догадываетесь что будет Вот такая проблемма Есть мысли?
Просто делай это в двух разных потоках. Один делает то, что ему надо, а другой тормозит его на 10 секунд тогда, когда потребуется. Зачем в одном потоке?
AndreyMust19 Делал в двух разных потоках. Но при вызове IWebBrowser::Navigate() в другом потоке, адает IE ( c ошибкой C0000005 ). Вот я и не знаю что и делать. Как только я ни пробовал уже
C0000005 - разбирайся с правами. Вызывай сначала IWebBrowser::Navigate(), а после делай задержку через sleep. IWebBrowser::Navigate() по любому отрабатывается в отдельном потоке.
Partner Sleep после IWebBrowser::Navigate() вешает IE на определенное время, и Navigate() не выполняется.
а организовать очередь функций. если надо отложит вызов, то в очереди он просто пропускается, а при повторной выборке проверяется время или не время, скажем через GetTickCount, такая плюшка (по-моему это называется не вытесняющая многозадачность) использовалась еще в 3.1 но для каждого (или почти каждого) системного вызова. Код (Text): addqueue(TaskFunc0); while (queuecount>0) { func_str=queuegetnext(); if (IsTime(func_str)) func_str.vector(func_str.params); } очередь думаю сам организуешь, структуру сам придумаешь. А это лишь пинок в нужную (или не нужную, блин мысли вслух) сторону. Причем заметь. Все эти функции выполняются в строгой последовательности (если не понял почему, то подумай над тем, зачем нужен param), при этом выполнение некоторых может быть отложено. А так же функции могут добавлять в очередь другие функции и самоудаляться. Важно помнить, чтобы эта история не грузила проц, должна быть хотя бы одна задача бездельник сливающая время в систему, если вся очередь прошла до нее без выполнения какой либо другой функции и умирающая если она осталась одна в очереди. Это может не самый простой выход из твоей ситуации, но судя по тому что было написано тобой - это то, что ты хочешь!
Вообще то IWebBrowser устарал. Попробуй IWebBrowser2. Я почему то считал, что Navigate выполняется асинхронно. Если же это не так, то твою задачу с одним потоком не решить.
Partner Я применяю IWebBrowser2 просто в примере сдесь написал IWebBrowser ( голова уже кругом идет ).
trust я как то тоже работал с IWebBrowser2 и ловил его события(DISPID_*) и получалось так что если поток из которого я устанавливал обработчик сообщений завершался, то и обработчик не работал, так же всё зависало если я ставил sleep. в итоге я сделал цикл оконных сообщений в конце потока GetMessage/TranslateMessage/DispatchMessage и всё заработало, только указатель на lpfnWndProc должен быть валидным, тоесть должна быть процедура окна.
Partner Я знаю, но если прочитать первое описание, то самое первое что приходит в голову вот это. Иначе формулируйте вопросы точнее.