органиязация задержки в цикле.

Тема в разделе "WASM.WIN32", создана пользователем trust, 26 янв 2009.

  1. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Всем добрый вечер. Столкнулся с проблемой. Необходимо организовать задержку в цикле на определеной время ( скажем 10 секунд ). Как мне это сделать, но без использования Sleep, SleepEx, CreateEvent + WaitForSingleObject да SetTimer тоже не подходит. Вобщем чтобы поток не останавливался. Буду рад любой помощи. Мучаюсь уже который день. Заранее спасибо.
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    ни разу за 10 сек конечно не получится - слишком грандозная бессонница в многоздачной среде :)) а так сверяйся периодически например с GetTickCount.
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Задержка, и чтобы поток не останавливался. Противоречие однако.
    И почему не подходит sleep?
     
  4. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Partner
    Потому что в это время потоке выполняется выполняется другой код. Поток нельзя остановить ( т.к. остановится выполнение другого когда ). Но и в другой поток этот код не запихнуть ( не работает в другом потоке ). Нужно чтобы код отработал. И при этом была задержка цикла. В коде асинхронные функции. Вот такая вот проблема.
     
  5. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Вобщем примерно так:
    for(i=0;i<5;i++)
    {
    do{
    сдесь задержка ( 5-10 секунд )
    }while(x!=1)
    асинхронная функция
    }
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    trust
    Это называется "стой там иди сюда".
    В одном потоке невозможно одновременное выполнение кода в двух местах.
    Асинхронная функция по определению выполняется в другом потоке. Иначе она никакая не асинхронная.
     
  7. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Partner
    Может быть я не прав (с асинхронностью:) ). Но просто необходимо чтобы эта функция отработала нормально. Для этого нужно реализовать задержку, как я схематически изобразил.
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Требования взаимно противоречивы. Чтобы поток ждал и в то же время выполнялся.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    trust
    то что ты нарисовал реализуется через sleep :))
    Другое дело если 10 сек делаешь что-то полезное, затем вызываешь свою "асихронную" функцию и продолжаешь выполнение программы - тут поможет GetTickCount.
     
  10. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Partner
    Вот тебе примерная задача. Если ты работал с COM.
    for(i=0;i<5;i++)
    {
    do{
    сдесь задержка ( 5-10 секунд )
    }while(x!=1)
    IWebBrowser::Navigate();
    x--;
    }
    Ловлю событие через DWebBrowserEvents2 и присваиваю x единицу. Ну а потом проверяю этот x. Потому что без задержки отработает только последня функция в цикле ( из-за особенности Navigate() ). А если задержку делать через Sleep(). То сами догадываетесь что будет:)
    Вот такая проблемма:dntknw:
    Есть мысли?
     
  11. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Просто делай это в двух разных потоках. Один делает то, что ему надо, а другой тормозит его на 10 секунд тогда, когда потребуется. Зачем в одном потоке?
     
  12. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    AndreyMust19
    Делал в двух разных потоках. Но при вызове IWebBrowser::Navigate() в другом потоке, адает IE ( c ошибкой C0000005 ). Вот я и не знаю что и делать. Как только я ни пробовал уже:dntknw:
     
  13. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    C0000005 - разбирайся с правами.
    Вызывай сначала IWebBrowser::Navigate(), а после делай задержку через sleep.
    IWebBrowser::Navigate() по любому отрабатывается в отдельном потоке.
     
  14. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Partner
    Sleep после IWebBrowser::Navigate() вешает IE на определенное время, и Navigate() не выполняется.
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а организовать очередь функций. если надо отложит вызов, то в очереди он просто пропускается, а при повторной выборке проверяется время или не время, скажем через GetTickCount, такая плюшка (по-моему это называется не вытесняющая многозадачность) использовалась еще в 3.1 но для каждого (или почти каждого) системного вызова.
    Код (Text):
    1. addqueue(TaskFunc0);
    2. while (queuecount>0)
    3. {
    4.   func_str=queuegetnext();
    5.   if (IsTime(func_str)) func_str.vector(func_str.params);
    6. }
    очередь думаю сам организуешь, структуру сам придумаешь. А это лишь пинок в нужную (или не нужную, блин мысли вслух) сторону. Причем заметь. Все эти функции выполняются в строгой последовательности (если не понял почему, то подумай над тем, зачем нужен param), при этом выполнение некоторых может быть отложено. А так же функции могут добавлять в очередь другие функции и самоудаляться. Важно помнить, чтобы эта история не грузила проц, должна быть хотя бы одна задача бездельник сливающая время в систему, если вся очередь прошла до нее без выполнения какой либо другой функции и умирающая если она осталась одна в очереди. Это может не самый простой выход из твоей ситуации, но судя по тому что было написано тобой
    - это то, что ты хочешь!
     
  16. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Вообще то IWebBrowser устарал. Попробуй IWebBrowser2.
    Я почему то считал, что Navigate выполняется асинхронно. Если же это не так, то твою задачу с одним потоком не решить.
     
  17. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    max7C4
    Для этого придумали thread pool.
     
  18. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    Partner
    Я применяю IWebBrowser2 просто в примере сдесь написал IWebBrowser ( голова уже кругом идет ).
     
  19. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    trust я как то тоже работал с IWebBrowser2 и ловил его события(DISPID_*) и получалось так что если поток из которого я устанавливал обработчик сообщений завершался, то и обработчик не работал, так же всё зависало если я ставил sleep.

    в итоге я сделал цикл оконных сообщений в конце потока
    GetMessage/TranslateMessage/DispatchMessage

    и всё заработало, только указатель на lpfnWndProc должен быть валидным, тоесть должна быть процедура окна.
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Partner
    Я знаю, но если прочитать первое описание, то самое первое что приходит в голову вот это. Иначе формулируйте вопросы точнее.