Здравствуйте, Макс!
На стр. 540 написано: “Можно так же получить и указатель на объект потока – для этого нужно вызвать статический метод QThread::currentThreadId()”. Правильно: метод QThread::currentThread().
Здравствуйте, Вячеслав!
Так как в main.cpp есть код класса MyThread с сигналом progress()
class MyThread : public QThread {
…
};
нам необходимо запустить метаобъектный компилятор, для создания файла с мета информацией для этого класса.
Было бы лучше класс конечно MyThread поместить в отдельный файл MyThread.h тогда этого делать бы не пришлось.
По поводу #include “main.moc” можно в книге еще найти информацию, в примечании на странице 60, раздела “Метаобъектный компилятор MOC”.
Здравствуйте, Макс!
На стр. 553 в Листинге 38.12, если вместо строки “QFuture future = QtConcurrent::mapped(lst.begin, lst.end(), myToUpper);” написать: “QFuture future = QtConcurrent::mapped(lst, myToUpper);”, вывод такой же, как и в исходном варианте. Есть ли какие-то различия в этих вариантах и обязательно использовать в методе QtConcurrent::mapped() итераторы?
Здравствуйте, Вячеслав!
Да, в пространстве имен QtConcurent определана функция в которую можно передавать контейнеры. В этом случае будут использованны все элементы контейнера, тоесть результат будет эквивелентен передаче итераторов lst.begin() и lst.end(). В случае использования итераторов вы можете изменить колличество элементов контейнера, например на один элемент меньше QtConcurrent::mapped(lst.begin()), –(lst.end()), myToUpper);
Здравствуйте!
Подскажите, пожалуйста, зачем в ваших примерах на QtConcurrent используется метод QFuture::waitForFinished() – ведь метод QFuture::result() и так блокируется, пока не будет доступен результат.
В главе 38 “процессы и потоки” на странице 550, раздел “блокировка чтения/записи”
в методе push() используется readWriteLock.lockForRead, хотя кажется логичнее было бы использовать lockForWrite
Андрей,
да действительно вы правы тут нужно использовать lockForWrite()
Спасибо за замечание
Здравствуйте, Макс!
На стр. 540 написано: “Можно так же получить и указатель на объект потока – для этого нужно вызвать статический метод QThread::currentThreadId()”. Правильно: метод QThread::currentThread().
Да, Вы правы, указатель можно получить при помощи статического метода QThread::currentThread(). Спасибо.
Макс, на странице 544 Листинг 38.5 есть строка: “#include “main.moc”. Для чего нужна эта директива в конце файла?
Здравствуйте, Вячеслав!
Так как в main.cpp есть код класса MyThread с сигналом progress()
class MyThread : public QThread {
…
};
нам необходимо запустить метаобъектный компилятор, для создания файла с мета информацией для этого класса.
Было бы лучше класс конечно MyThread поместить в отдельный файл MyThread.h тогда этого делать бы не пришлось.
По поводу #include “main.moc” можно в книге еще найти информацию, в примечании на странице 60, раздела “Метаобъектный компилятор MOC”.
Здравствуйте, Макс!
На стр. 553 в Листинге 38.12, если вместо строки “QFuture future = QtConcurrent::mapped(lst.begin, lst.end(), myToUpper);” написать: “QFuture future = QtConcurrent::mapped(lst, myToUpper);”, вывод такой же, как и в исходном варианте. Есть ли какие-то различия в этих вариантах и обязательно использовать в методе QtConcurrent::mapped() итераторы?
Здравствуйте, Вячеслав!
Да, в пространстве имен QtConcurent определана функция в которую можно передавать контейнеры. В этом случае будут использованны все элементы контейнера, тоесть результат будет эквивелентен передаче итераторов lst.begin() и lst.end(). В случае использования итераторов вы можете изменить колличество элементов контейнера, например на один элемент меньше QtConcurrent::mapped(lst.begin()), –(lst.end()), myToUpper);
Здравствуйте!
Подскажите, пожалуйста, зачем в ваших примерах на QtConcurrent используется метод QFuture::waitForFinished() – ведь метод QFuture::result() и так блокируется, пока не будет доступен результат.
Спасибо Дмитрий за интересный вопрос. Действительно в примерах 38.11 и 38.12 можно обойтись без QFuture::waitForFinished().