crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Потоконезависимые очереди
Введите ваше имя
Подтвердите код

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

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
BRE Дата 10.11.2011, 16:58
 
Цитата(AD @ 10.11.2011, 17:40) *
Цитата(BRE @ 10.11.2011, 17:36) *
exec никуда не возвращает, она просто запускает цикл обработки событий для данного потока. Выйти из этого цикла позволяет метод quit или exit класса QThread.

А... Начинает доходить. Т.е. по сути exec() запустить в теле run(). А затем с помощью сигналов и слотов выполнить нужные мне действия. Так ведь можно решить?

Да можно и так, только есть ли смысл постоянно крутить цикл обработки событий (который много чего делает) только для того, что бы получить очередное задание. :rolleyes:
AD Дата 10.11.2011, 16:40
 
Цитата(BRE @ 10.11.2011, 17:36) *
exec никуда не возвращает, она просто запускает цикл обработки событий для данного потока. Выйти из этого цикла позволяет метод quit или exit класса QThread.

А... Начинает доходить. Т.е. по сути exec() запустить в теле run(). А затем с помощью сигналов и слотов выполнить нужные мне действия. Так ведь можно решить?
BRE Дата 10.11.2011, 16:36
  exec никуда не возвращает, она просто запускает цикл обработки событий для данного потока. Выйти из этого цикла позволяет метод quit или exit класса QThread.
AD Дата 10.11.2011, 16:26
 
Цитата(BRE @ 10.11.2011, 17:19) *
Пытаешься написать методом научного тыка? :)

Да нет. Просто никак не могу понять, зачем этот exec(), если я не возвращаюсь в поток? Понятное дело, что после нескольких попыток в итоге сделаю по другому, но хотел разобраться, как заставить вернуться в функцию run правильно?
BRE Дата 10.11.2011, 16:19
  Пытаешься написать методом научного тыка? :)
AD Дата 10.11.2011, 15:47
  А вот так в поток не попадаю вторично:
/// Запуск потока вычисления
void CalcThread::run()
{
    if(!QueueRequests.isEmpty())
    {
                     wait(_sec * TO_MILLISEC);
        Request request(QueueRequests.takeRequest());
        int error_code;
        double result = doOperation(request.type_work, request.first_operand, request.second_operand, error_code);
    }

    exec();
}

Поток запускаю в главном потоке в конструкторе.
Iron Bug Дата 10.11.2011, 15:38
  дык, в безусловном цикле крутится - потому и жрёт. любой поллинг жрёт проц.
тебе же про условные переменные говорили - вот и примени их, чтобы было условие, что в очереди что-то появилось, а в рабочем потоке - ожидание этого условия.
AD Дата 10.11.2011, 15:30
 
Цитата(BRE @ 10.11.2011, 16:27) *
"Память жрет" это ты про "процессор жрет"? :)
Что такое функция wait, как она определена?
А лучше ты все покажи. ;)

Да, проц жрет. wait - функция QThread. Так у меня это одна функция в Qthread. :)
BRE Дата 10.11.2011, 15:27
  "Память жрет" это ты про "процессор жрет"? :)
Что такое функция wait, как она определена?
А лучше ты все покажи. ;)
AD Дата 10.11.2011, 14:22
  Из главного потока запустил дополнительный. В дополнительном у меня вечный цикл (forever) - памяти жрет 50%. Есть возможность, не отменяя цикла forever сделать так, чтобы память не жралась безмерно?

С потоками уже не раз работал, но еще ни разу не использовал forever в доп. потоке, потому такие вопросы и встают.

Пока что делаю так (память жрет):
/// Запуск потока вычисления
void CalcThread::run()
{
    forever
    {
        wait(_sec * TO_MILLISEC);
        if(QueueRequests.isEmpty())
            continue;

        Request request(QueueRequests.takeRequest());
        int error_code;
        double result = doOperation(request.type_work, request.first_operand, request.second_operand, error_code);
    }
}
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 22:42