crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Ошибка при использовании QtConcurrent
Alexander
  опции профиля:
сообщение 21.10.2012, 16:41
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.10.2012
Пользователь №: 3573

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго времени суток) Писал приложение

mainwindow.cpp
void MainWindow::forther()
{
for (int i=0;i<500;i++)
    {
        MainWindow::setWindowTitle(QString::number(i));
    }
}

void MainWindow::on_pushButton_clicked()
{
    QtConcurrent::run(this, &MainWindow::forther);
}


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    void forther();
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:

    void on_pushButton_clicked();
private:

    Ui::MainWindow *ui;
public slots:

signals:

};
#endif // MAINWINDOW_H


При нажатии на кнопку программа выдает ошибку "This Application Has Requested The Runtime To Terminate It In An Unusual Way "
Помогите проблему, заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.10.2012, 17:04
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


во-первых - налицо отсутсвие синхронизации потоков

ещё - по описанию функции первым параметром должен стоять указатель на функцию (из чего ещё следует, что функция должа быть статическая)

далее список параметров не описан в доке - думаю, туда первым можно засунуть указатель на контекст, как это стандартно для поточных функций и делается
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.10.2012, 17:11
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Alexander @ 21.10.2012, 19:41) *
QtConcurrent::run(this, &MainWindow::forther);
объясни эту запись, я её не понимаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alexander
  опции профиля:
сообщение 21.10.2012, 17:48
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.10.2012
Пользователь №: 3573

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
объясни эту запись, я её не понимаю.

т.к. forther работает с элементами формы,то я не могу ее сделать как static. в гугле нашел такой вроде рабочий пример для вызова

Цитата
ещё - по описанию функции первым параметром должен стоять указатель на функцию (из чего ещё следует, что функция должа быть статическая)

далее список параметров не описан в доке - думаю, туда первым можно засунуть указатель на контекст, как это стандартно для поточных функций и делается

если я правильно понял, то конструкция
QtConcurrent::run(&MainWindow::forther, this);

выдает ошибку
no matching function for call to 'run(void (MainWindow::*)(), MainWindow* const)'

Цитата
во-первых - налицо отсутсвие синхронизации потоков

я просто думал при нажатии кнопки создать поток, что-то там обработать и его завершить, или надо с самого начала создавать 2 потока?


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.10.2012, 17:54
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Alexander @ 21.10.2012, 20:48) *
т.к. forther работает с элементами формы,то я не могу ее сделать как static. в гугле нашел такой вроде рабочий пример для вызова



static void forther(MainWindow* pThis)
{
pThis-> элемент формы
}


и тогда перестанет ругаться
Цитата
no matching function for call to 'run(void (MainWindow::*)(), MainWindow* const)'


Цитата(Alexander @ 21.10.2012, 20:48) *
я просто думал при нажатии кнопки создать поток, что-то там обработать и его завершить, или надо с самого начала создавать 2 потока?

про синхронизацию это я на всякий случай отметил, в данном случае дело не в ней. Хотя работа с одним ресурсом из двух потоков уже присутствует, значит синхронизацию делать надо будет

Сообщение отредактировал Алексей1153 - 21.10.2012, 17:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alexander
  опции профиля:
сообщение 21.10.2012, 19:06
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.10.2012
Пользователь №: 3573

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возможно проблема смешна и глупа,но пытался изменить код функции,но все время были ошибки

Цитата
static void forther(MainWindow* pThis)
{
pThis->setWindowTitle("213")
}

тогда решил проверить на простом примере

void MainWindow::on_pushButton_clicked()
{
    MainWindow *pwe;
    pwe->setWindowTitle("213");
}



вызывает ошибку segmentation fault если смотреть в отладчике, иначе просто выводит окно о прекращении работы программы
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.10.2012, 19:27
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Alexander, неинициализированная переменная.

MainWindow *pwe;


указатели хотя бы нулём инициализируй

MainWindow *pwe=0;


ну и дальше, указатель на что-то всё же должен указывать, чтобы можно было обратиться к методу указуемого

Цитата(Alexander @ 21.10.2012, 22:06) *
но все время были ошибки


телепатов не существует, покажи эти ошибки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Alexander
  опции профиля:
сообщение 21.10.2012, 20:43
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 21.10.2012
Пользователь №: 3573

Спасибо сказали: 0 раз(а)




Репутация:   0  


Большое спасибо за помощь, все работает как надо =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 23:50