ProgressBar на QtConcurrent |
Здравствуйте, гость ( Вход | Регистрация )
ProgressBar на QtConcurrent |
Fitz |
22.11.2010, 15:30
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 22.11.2010 Пользователь №: 2207 Спасибо сказали: 0 раз(а) Репутация: 0 |
Уважаемые, хочу прикрутить к терминалу COM-порта ProgressBar загрузки файла в порт.
Сделав, соответстветственно, загрузку файла отдельным потоком. Заюзал Qt'шный экзампл Progress Dialog, где используют QtConcurrent. Код: mainwindow.h
mainwindow.cpp
Компилятор ругается в futureWatcher.setFuture(QtConcurrent::map(fileList, MainWindow::loadFile));, мол там нужен адрес функции, однако и подстановка адреса не помогает. Что делаю не так? Возможно есть более грамотное решение с QThread, подскажите. |
|
|
BRE |
22.11.2010, 16:32
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
А ты посмотри в примерах, как определены функции для QtConcurrent::map. Являются ли они членами класса, как у тебя.
|
|
|
Fitz |
23.11.2010, 13:29
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 22.11.2010 Пользователь №: 2207 Спасибо сказали: 0 раз(а) Репутация: 0 |
В примерах вообще класс не создается - просто некоторая (normal) функция и ее вызов через QtConcurrent в main().
Но насколько я понял из доки необходимо, чтобы функция void loadFile(const QString &fileName); была статической и принималась еще и по указателю. Using Member Functions Раскрывающийся текст QtConcurrent::map(), QtConcurrent::mapped(), and QtConcurrent::mappedReduced() accept pointers to member functions. The member function class type must match the type stored in the sequence:
Причем не важно членом какого класса она является. Я прав? |
|
|
BRE |
23.11.2010, 15:55
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Внимательно посмотри на приведенные примеры. Посмотри, что является входным параметром, с объектом какого класса происходит операция и с использованием какого метода.
Например, первый фрагмент: Входные данные: strings - список строк; Класс объекта для которого выполняется операция: QString - строка; Какой метод применяется: QString::squeeze. |
|
|
Fitz |
24.11.2010, 20:14
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 22.11.2010 Пользователь №: 2207 Спасибо сказали: 0 раз(а) Репутация: 0 |
После осознания наваял следующую конструкцию, котороая, как ни странно, заработала.
Создал отдельный класс прошивки: ufirmware.h
ufirmware.cpp
Теперь применение: mainwindow.cpp
Вопрос раз: необходимо ли делать класс uFirmware потокобезопасным? Вопрос два: код работает не совсем так, как мечталось - futureWatcher вычисляет только работу метода класса, а вот используемый им метод сторонней библиотеки AbstractSerial::write(QByteArray a)(в интересах которого, собственно, и выделяется отдельный поток) в расчет не берется. Выходит надо работать напрямую с классом AbstractSerial? Но тогда каким образом передавать методу записи в порт write(QByteArray a) этот внешний параметр? |
|
|
Текстовая версия | Сейчас: 27.12.2024, 4:59 |