10801
|
Qt / Общие вопросы / Re: Трудоемкие задачи (прервать или продолжить). Как прервать?
|
: Декабрь 12, 2009, 14:23
|
Вроде функцию подогнал под читабельность. Кто может как улучшить код? 1) Уберите ВСЕ вызовы processEvents - везде. Посмотрите и подумайте зачем нужен UPDATE_STEP 2) Не создавайте избыточного кода методом copy/paste. Попробуйте так C++ (Qt) bool Spreadsheet::is_item_in_list_selection_range(const QList<QTableWidgetSelectionRange>& range, int row_, int column) { for(int i = 0 ; i < range.size(); i++) { if (row_ < range[i].topRow()) continue; if (row_ > range[i].bottomRow()) continue; if (column < range[i].leftColumn()) continue; if (column > range[i].rightColumn()) continue; return true; } return false; }
|
|
|
10802
|
Qt / Общие вопросы / Re: Трудоемкие задачи (прервать или продолжить). Как прервать?
|
: Декабрь 12, 2009, 01:20
|
Кто может помогите?
Я не "придираюсь" но с таким текстом как у Вас желание помочь быстро пропадает. Отрихтуйте, почистите - if (UpdateProgress(progress, i)) return false; Неудачное название если ф-ция возвращает false - processEvents ест время ничего не делает (поскольку UpdateProgess это решает) "== true" выглядит не очень естественно - текст должен выглядеть ровно (а не как бык поссал) - возможно что тормоза в is_item_in_list_selection_range, покажите ее тоже Вот когда все подправите - тогда и поговорим.
|
|
|
10803
|
Компиляторы и платформы / Компиляторы / Re: Как избавиться от импорта msvcrt.dll на MinGW?
|
: Декабрь 11, 2009, 22:54
|
.lib-файлы и .a-файлы все это статические библиотеки. Просто ".lib" - стандартное виндозное расширение для них
Например, у Вас на Вындоуз MSVC подключена kernel32.lib - так что, весь код kernel у Вас статически в exe файле? А если посмотреть тот же lib файл то можно увидеть имена dll файлов. Простота и ясность (как Вы хотели) не есть стиль Микрософт:)
|
|
|
10805
|
Qt / Общие вопросы / Re: Параллельные вычисления (проблемы)
|
: Декабрь 11, 2009, 14:02
|
Из описания правильно. Допустим. У вас 4 ядра, и 4 рабочих нитки. 1. скажите, рабочие нитки загружены на 100 процентов? 2. сколько раз(за время своей жизни), в сумме, происходит блокировка разделяемого ресурса нитками?
1) Увы, совсем не на 100% (принимаем 100% = все 4 загружены до упора). Типичная загрузка только 65-70%, а очень хотелось бы большего. Остальное idle, а когда N неудачно - появляется довольно мощный overhead (монитор показывает его как "system" красным). 2) Блокировки конечно есть для I/O и.т.п. Но в тестах реально работает только одна - для выборки ниткой следующей пачки задач из очереди. Реализация QSpinLockLock/QSpinLockUnlock (это OSX аналог QAtomicInt). Тесты показывают что "львиная доля" тратится на подъем/усыпление рабочих ниток на семафорах. Не вижу возможности сделать 1 семафор для всех ниток (получается каждая должна иметь свой) да и неясно помогло бы это - ведь усыпление все равно будет.
|
|
|
10806
|
Qt / Пользовательский интерфейс (GUI) / Re: Сигнал "что-то изменилось". Как вместо 10 сигналов сделать 1?
|
: Декабрь 11, 2009, 13:44
|
Хочется избавиться от утомительного анализа "а не было ли сначала др. сигнала (старшего)?" Разбить функционал tools_update на части можно, но проблема остается. Я бы сначала в tools_update прикинул не является ли действие холостым, т.е. уже выполнено предыдущими действиями (хранил бы какие-то "текущие" данные и сравнивал их с пришедшими). Если совпадают - не лезть к диску, не обновлять UI а просто выйти. Вообще чем занимается tools_update?
|
|
|
10807
|
Qt / Общие вопросы / Re: Параллельные вычисления (проблемы)
|
: Декабрь 11, 2009, 08:31
|
Если это так, и принцип делегирования реализован !правильно!, то самое время подумать над кластером.
Про делегирование ничего не слышал Главная нитка помещает задачи в очередь. Как только в очереди окажется N (размер кластера) задач - все рабочие нитки снимаются со своих семафоров и начинают брать задачи из очереди (также кластером из N задач). N в моих руках, управляемо. Послав все задачи, главная нитка засыпает на семафоре но перед этим досылает еще по одной "псевдо-задаче" (для каждой рабочей нитки). Получив задачу-терминатор, рабочая нитка засыпает на своем семафоре. Последняя засыпающая открывает семафор главной нитке. Это все
|
|
|
10808
|
Компиляторы и платформы / Компиляторы / Re: gcc 4.4 (XCode)
|
: Декабрь 11, 2009, 08:17
|
Интереса ради, запустил сборку 4.4.2(по своей же инструкции). Пока все пучком А у меня нет Не проходит sudo make install - она спрашивает пароль но дальше ничего не происходит. Ввожу неверный пароль - понимает, отклоняет. Пробую make install (без sudo) - начинает что-то делать, но, конечно, получаю Permission denied В любом случае - спасибо за помощь, niXman
|
|
|
10810
|
Компиляторы и платформы / Компиляторы / Re: gcc 4.4 (XCode)
|
: Декабрь 11, 2009, 07:38
|
Я абсолютно не знаком с Мас, но очень знаком с *nix. Так вот, из исходников, компилятор собирается на ура. И скриптом устанавливается. Попробуй их сорцов собрать.
Каким образом? Я пытался прорваться так: - набрал ./configure Он мне много написал в консоли. Ну наверное что-то сделал, ладно - набрал make - он начал что-то делать но загнулся на genmodes: No such file.. Ну а дальше я не знаю что набирать
|
|
|
10811
|
Qt / Общие вопросы / Re: QPainter::drawPixmap - похоже конкретный Баг?
|
: Декабрь 11, 2009, 07:25
|
Попутал (привык left, top, right, bottom ) Но на Mac такого нет, слева 2 красных пикселя (как в debug, так и в release). На всякий случай вот полный текст. void Widget::paintEvent ( QPaintEvent * ) { QPixmap pm(10, 10); if (1) { QPainter painter(&pm); painter.fillRect(QRect(0, 0, 10, 10), Qt::green); painter.fillRect(QRect(0, 0, 1, 10), Qt::red); painter.drawPixmap(QRect(1, 0, 9, 10), pm, QRect(0, 0, 9, 10)); } QPainter painter(this); painter.drawPixmap(QRect(0, 0, 10, 10), pm, QRect(0, 0, 10, 10)); }
|
|
|
10812
|
Qt / Общие вопросы / Re: QPainter::drawPixmap - похоже конкретный Баг?
|
: Декабрь 11, 2009, 06:38
|
C++ (Qt) QPixmap Pixmap(10, 10); QPainter Painter(Pixmap); Painter.fillRect(Pixmap.rect(), Qt::green); // заливаем квадрат 10х10 зеленым - ясно Painter.fillRect(QRect(0,0,1,10), Qt::red); // слева рисуем вертикальную красную полосу в 1 пиксель Painter.drawPixmap(QRect(1,0,9,10), *Pixmap, QRect(0,0,9,10)); // ???
А вот последняя строка непонятно что делает. Если цель - сдвиг/скролл, то QRect должны быть равны по размерам. И что куда копируется? Получается: взяли квадрат (без правой линии), и вписали его в прямоугольник на 1 пиксель меньше? Какой-то мутный сдвиг:)
|
|
|
10813
|
Компиляторы и платформы / Компиляторы / gcc 4.4 (XCode)
|
: Декабрь 11, 2009, 06:08
|
Здравствуйте Потребовался мне компилятор gcc 4.4 (нужен для одной из библиотек). Но, к сожалению, он не идет вместе с XCode IDE (хотя заявлено что да, он работает с OSX и XCode), то есть надо его "ставить". Погуглил, максимум что нашел вот это http://gcc44.darwinports.com/. Просьба: хотя бы в самых общих чертах объясните о чем речь в этой инструкции. Что я должен делать чтобы поставить? (разумеется, сам gcc я скачал). Последнюю часть (про macports) я знаю, но воспользоваться не могу (по техническим причинам). Можно как-то по-другому? Спасибо
|
|
|
10814
|
Программирование / С/C++ / Re: Передача значений
|
: Декабрь 10, 2009, 20:14
|
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) editor->insertPlainText(tr("Файл не существует")); QTextStream filein(&file); Подозрительные флаги открытия. Имеет смысл проверить if (!file.open(QIODevice::ReadOnly)) { editor->insertPlainText(tr("Файл не существует")); return; } QTextStream filein(&file); Такая конструкция точно работает
|
|
|
|
|