Название: синхронизация потоков Отправлено: taifun от Сентябрь 21, 2011, 10:18 Здравствуйет!
Особо сильно тему синхронизации потоков не изучил, но хотелось бы сразу узнать - есть ли возможность синхронизовать два потока? Суть проблемы вот в чем: запускаю первый поток, который должен выполнять вычисление valX запускаем второй поток, у которого следующий алгоритм: Код: for(int i = 0; i <15; i++){ Название: Re: синхронизация потоков Отправлено: alexman от Сентябрь 21, 2011, 10:23 А зачем вообще 1-ый поток, если вы его один фиг ждете?
А вообще посмотри QObject::connect с параметром Qt::BlockingQueuedConnection. Название: Re: синхронизация потоков Отправлено: LisandreL от Сентябрь 21, 2011, 10:28 Ну у потоков есть wait, isFinished;
Для парадигмы запустили поток-функцию и получили из него результат по окончании работы зачастую удобней использовать QtConcurrent::run. Название: Re: синхронизация потоков Отправлено: taifun от Сентябрь 21, 2011, 10:47 А зачем вообще 1-ый поток, если вы его один фиг ждете? А вообще посмотри QObject::connect с параметром Qt::BlockingQueuedConnection. Дело в том, что первый поток помимо вычисления valX, готовит данные для графика и посылает сигнал виджету с графиком, когда необходимо обновить изображение ... потому и использую поток что бы GUI "не заморозить". Вообще QObject::connect я и использую с параметром Qt::BlockingQueuedConnection. но тут есть небольщая сложность. сначала я вызываю функцию с необходимыми параметрами для потока (что я и имел ввиду в алгоритме под "запускаем поток 1"), которые присваиваю членам класса и потом в этой функции уже в самом конце выполнения вызываю start(QThread::NormalPriority), что конечно же приводит к неверному, точнее сказать к нежелаемому результату работы потоков ... может как-то можно сразу запустить поток передав параметры непосредственно ему. Про wait() знаю, но как использовать это не понимаю, так как поток 1 ничего не знает про поток 2 и наоборот, а связь между ними сделал через сигнал/слот. Название: Re: синхронизация потоков Отправлено: alexman от Сентябрь 21, 2011, 11:14 Зачем вам два потока? У вас есть один поток, который не морозит gui-нитку. В нем все вычисления и делайте.
Ну или можно так: Код: for(int i = 0; i <15; i++){ Если же thread уже запущен, то надо ему сигнал с параметрами послать о вычислении. Ну далее можно флаг какой-нить дожидаться: Код: for(int i = 0; i <15; i++){ |