Как зациклить программу, чтобы она продолжала выполнение - PullRequest
1 голос
/ 01 мая 2011

В настоящее время у меня есть этот код

#include <iostream>
#include <curl.h>
#include <windows.h>
#include "boost\timer.hpp"


int main(void)
{
    CURL *curl;
    CURLcode res;
    boost::timer t;

    int number = 1;

    while (number == 1)
    {
         if(t.elapsed() > 10)
         {
            curl = curl_easy_init();
            if(curl) 
            {
                curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
                res = curl_easy_perform(curl);

                /* always cleanup */ 
                curl_easy_cleanup(curl);
            } 
            t.restart();
         }
      }
}

Что я хотел бы сделать, это продолжить выполнение этой программы и никогда не заканчиваться, пока кто-то не закроет окно.Я попробовал вышеупомянутый код, однако загрузка ЦП возросла до 25% на моем четырехъядерном ЦП.

Так как же продолжить выполнение программы и зациклить код в то время, не используя так много ЦП?

PS 25% на четырехъядерном процессоре означает 100% использование процессора на одноядерном процессоре.

Ответы [ 8 ]

3 голосов
/ 01 мая 2011

Вы можете использовать Sleep(10000), чтобы приостановить выполнение программы прибл.10 секунд.Вы можете отбросить boost::timer - просто спать 10 секунд в каждой итерации цикла (Sleep не такой точный, но в течение 10 секунд неточность должна быть незначительной).

Ваш код - это то, что называется "занятым циклом"'- для процессора не имеет значения, работаете ли вы в узком цикле без особой работы или выполняете тяжелые вычисления.Оба будут использовать 100% ядра процессора, потому что поступает бесконечный поток инструкций. Чтобы использовать меньше, вам нужно на некоторое время отказаться от выполнения, чтобы ОС могла выполнять другие процессы.

2 голосов
/ 01 мая 2011

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

Один из способов сделать настоящий сон в бусте - это boost :: this_thread :: sleep .

1 голос
/ 01 мая 2011

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

for (;;)

или

while (true)
1 голос
/ 01 мая 2011

Если нужно замедлить это с некоторыми sleep(). По сути, вам нужно перевести ваш поток в спящий режим, чтобы другие процессы могли выполняться.

0 голосов
/ 01 мая 2011

Подумайте об использовании таймера вместо того, чтобы делать такой жесткий цикл.В качестве альтернативы вы можете поместить System.Threading.Thread.Sleep (300) между ними.

Кто-то должен был бы убить ваш процесс, чтобы закрыть его, я не могу различить любое окно в вашем коде.Если вы опрашиваете веб-сайт (похоже, вы там что-то делаете с Google), то я бы посоветовал вам сделать гораздо больший интервал!Не многие веб-мастера были бы рады увидеть такую ​​деятельность.Скорее всего, это будет DOS-атака!

В любом случае, если есть окно, лучше поместите этот код в делегат таймера, иначе запустите таймер и разрешите пользователю как-нибудь выйти из вашей программы (возможно,с Console.ReadKey () или около того).

0 голосов
/ 01 мая 2011

Звоните SwitchToThread() внутри вашей while петли. (Sleep меньше идеального, так как теряет текущий временной интервал, даже если это не нужно другим потокам.)

0 голосов
/ 01 мая 2011

Вы можете boost::threads запустить его в своем собственном потоке, а затем сделать thread.join в основном потоке, чтобы дождаться его.Если другой поток никогда не завершается из-за while(true), тогда ваша программа будет работать, пока вы не закроете окно.

0 голосов
/ 01 мая 2011

Похоже, вы хотите спать после каждой операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...