Russian Qt Forum
Октябрь 01, 2024, 07:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: multi-threading porting  (Прочитано 9393 раз)
vregess
Гость
« Ответ #15 : Август 30, 2012, 14:58 »

Я, может, тоже не совсем понял задачу.
Не совсем понятны эти троеточия в CData, как там все связано. Ну раз видно только mCube, DoCalc(), SetupCube(), DoSomethingWithCubes(), значит методы выполняются последовательно, и извне не используются SetupCube() и DoSomethingWithCubes(), наверное хост будет юзать mCube после этих вычислений.

Почему бы не выделить это все в отдельный воркер и помещать его в пулл потоков для вычислений.
Псевдокод (очень упрощенно):

Код
C++ (Qt)
QThread *th = getIdleThred();
CubeWorker *worker = new CubeWorker();
worker->moveToThread(th);
 
connect(worker, SIGNAL(ready(CData*)), this, SLOT(proceed(CData*));
connect(this, SIGNAL(calc(CData*)), worker, SLOT(doCalc(CData*)));
 
emit calc(data);
 

Те хост говорит начать вычисления и ловит сигнал окончания, потом использует. Если нужно выполнить синхронно, то указываем дополнительные параметры в connect().
Если нет, то пулл должен организовывать очередь запросов, если все потоки заняты.
В принципе мы тут не используем всякие блокировки напрямую - все делает фреймворк (вопрос, насколько оптимально).
Не могу сказать, сколько займет процесс подготовки воркера (перемещение в поток и вызов слота doCalc).
Вот такая вот идея.

PS Забавно, об этом топике узнал из эпического "Нежелание новичков изучать документацию", похоже "показать новые сообщения" работает избирательно Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Август 30, 2012, 16:37 »

Не совсем понятны эти троеточия в CData, как там все связано. Ну раз видно только mCube, DoCalc(), SetupCube(), DoSomethingWithCubes(), значит методы выполняются последовательно, и извне не используются SetupCube() и DoSomethingWithCubes(), наверное хост будет юзать mCube после этих вычислений.
Не будет. Если бы какие-то данные использовались совместно/shared - я обязан был бы упомянуть. А так Вы совершенно правильно полагаете что хосту известно только DoCalc и ничего более (про mCube он тоже ничего не знает). Поэтому сигналы здесь не нужны.
Записан
vregess
Гость
« Ответ #17 : Август 30, 2012, 17:25 »

Не будет. Если бы какие-то данные использовались совместно/shared - я обязан был бы упомянуть. А так Вы совершенно правильно полагаете что хосту известно только DoCalc и ничего более (про mCube он тоже ничего не знает). Поэтому сигналы здесь не нужны.

Тогда не понятно, что нужно получить.
То, что надо выполнять DoCalc() безопасно для данных CData, ни о чем особо не говорит (вторая страница догадок Улыбающийся).

Слишком мало информации.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 30, 2012, 18:46 »

Тогда не понятно, что нужно получить.
То, что надо выполнять DoCalc() безопасно для данных CData, ни о чем особо не говорит (вторая страница догадок Улыбающийся).
Как раз о всем и говорит. Выполнять его безопасно надо - как есть он просто загнется. А "просто залочить" - позорный провал по скорости (см. обсуждение выше).
Как это приспособить для выполнения 2-мя или более нитками. учитывая что вызовы SetupCube обычно съедают намного больше половины времени выполнения?
Что не так, неясно и зачем включать непонятку?  Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.