Russian Qt Forum
Июня 10, 2025, 00:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Аварийное завершение программы при использованиии Concurrent API  (Прочитано 20941 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
AlekseyK
Гость
« : Октября 27, 2009, 19:24 »

Вобщем имеем такой код:
Код:
    QEventLoop loop;
    QFutureWatcher<void> watcher;
    connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit()));
    QFuture<void> future = QtConcurrent::run(this, &MyClass::MyMethod, parameters...);
    watcher.setFuture(future);
    loop.exec();

При использовании такой конструкции вылетает segmentation fault. Если просто вызвать MyMethod с параметрами, то всё работает без ошибок, но это неудобно т.к. в этом методе запускается продолжительный вычислительный процесс и хочется, чтобы он выполнялся в отдельном потоке. Если зкомментировать цикл и QFutureWatcher, то вылетает уже другая ошибка, но суть та же. Воспроизводится как в Qt 4.5.3, так и в 4.6.0-beta1, и в Windows, и в Linux.

В чём может быть проблема: это моя ошибка или баг Qt и надо им писать отчёт?

Думаю ещё запустить Valgrind, чтобы проверить нет ли где ошибки обращения к памяти в моём приложении.

Цитата: Вывод приложения:
ASSERT: "qApp && qApp->thread() == QThread::currentThread()" in file kernel\qapplication_win.cpp, line 895
QWaitCondition: Destroyed while threads are still waiting
Записан
Rcus
Гость
« Ответ #1 : Октября 27, 2009, 19:46 »

Ну вот именно это утверждение должно гарантировать что к функциям рисования будут обращаться только из главного потока, что происходит в другой системе тоже надо смотреть, а вообще так ли сложно запустить отладчик и узнать след стека вызовов?
Я тоже не любил отладчики, но после сеанса ловли SIGSEGV при инициализации фреймбуффера без отладочных символов (памяти не хватало) очень даже полюбил их (хотя без крайней необходимости использую только для посмертного изучения процесса)
Записан
AlekseyK
Гость
« Ответ #2 : Октября 27, 2009, 20:36 »

Ну вот именно это утверждение должно гарантировать что к функциям рисования будут обращаться только из главного потока
Понятно, этот момент я видимо пропустил в документации. Благодарю! Исправил. Я использовал QTextEdit для вывода отладочной информации из этой функции и... repaint(),  Смеющийся чтобы что-то увидеть пока идут вычисления, т.к. они выполнялись в том же потоке, теперь я благополучно убрал ui->errorEdit->repaint() за ненадобностью, всё работает! Спасибо.

P.S. Qt таки рулит! Подмигивающий
P.P.S. А чем всё-таки может быть связана такая особенность Qt Concurrent?
« Последнее редактирование: Октября 27, 2009, 21:34 от AlekseyK » Записан