Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
1

Деструкторы в других потоках

15.04.2017, 13:39. Показов 3309. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создаю класс, пихаю его в другой поток (moveToThread)
По коннекту запускаю его функцию, если поток запущен.
Если что-то добавить в деструктор, компилятор пишет что-то вроде "не может быть удален из другого потока"...
Так и должно быть? Как-то немного напрягает, что деструктор не запускается. А если я захочу удалить поток, по коннекту deleteLater() удалит содержимое класса за деструктор?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2017, 13:39
Ответы с готовыми решениями:

Виртуальные деструкторы и функции
Немного тупой вопрос: Есть три класса, наследующие друг друга. Вот я где то читал, что для...

Выполнение кода после того как будут выполнены методы в других потоках
Необходимо продолжить выполнение кода только тогда когда потоки завершат свою работу. ... ...

Деструкторы
Здравствуйте. Помогите понять, почему в коде, где комментарий к конструктору "//Создает объект и...

Деструкторы
Вообщем сразу к сути. В нижеприведенном примере вызывается 2 деструктора. Я никак не пойму, почему...

22
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.04.2017, 13:41 2
Программу покажи.
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
15.04.2017, 14:51  [ТС] 3
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
    thread  = new QThread;
    TaskThread *Im = new TaskThread;
    Im->moveToThread(thread);
    connect(thread, SIGNAL(started()), Im, SLOT(process()));
    connect(Im, SIGNAL(finished()), thread, SLOT(quit())); 
    connect(Im, SIGNAL(finished()), Im, SLOT(deleteLater())); 
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
taskthread.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TaskThread : public QObject
{
    Q_OBJECT
public:
    explicit TaskThread(QObject *parent = 0);
    ~TaskThread();
private:
    function *f;
    int FillXY_from_keyboard();
    QVector<double> *Y;
signals:
    void finished(); 
    void error();
 
public slots:
    void process();
};
int FillXY_from_keyboard(); заполняет дабловские значения и кидает их в f

Т.е. вот функция из taskthread.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
void TaskThread::process()
{
    Y = new QVector<double>;
    FillXY_from_keyboard();
    function f1(Y, 0, 0, 1, 100);
 
    emit finished();
}
function.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class function
{
public:
    function(QVector<double> *y, double x, double a, double b, double np);
    ~function();
    QVector<double> f(double x, QVector<double> *Y1);
    void step();
 
    //friend const function& operator+(const function &f);
 
private:
    QVector<QVector<double>> *Y;     //y0 = (y01, y02, ..., y0n)
    double X;
    double A = 0;
    double B = 1;
    double NP = 100;        //Number of partitions
    int N;                  //dimention of system
    double h = (B-A)/NP;
};
function.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    A = a;
    B = b;
    NP = np;
    h = (B-A)/NP;
    Y = new QVector<QVector<double>>;
    Y->resize(y->size());
    Y->fill(QVector<double>(NP));
    for(int i = 0; i < y->size(); i++)
    {
        (*Y)[0][i] = (*y)[i];
    }
 
    for(int i = 0; i<y->size(); i++)
    {
        qDebug()<<(*Y)[0][i];
    }
Так вот стоит в деструкторе taskthread.cpp удалить f, все ломается.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.04.2017, 16:15 4
Цитата Сообщение от wlmn Посмотреть сообщение
стоит в деструкторе taskthread.cpp удалить f
Что за f? Где оно создаётся?
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
15.04.2017, 16:21  [ТС] 5
function *f; в привате taskthread.h
И дальше, да, я не создавал экземпляр его, но сейчас исправил и добавил в function.cpp
f = new function;

При вызове деструктора taskthread программа зависает (выдает такую ошибку... виндоус пытается устранить проблему...), т.е. при попытке удалить f
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.04.2017, 16:26 6
Ты слишком увлекаешься new. И f и Y - по одному экземпляру. Сделай их просто полями классов.
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
15.04.2017, 16:41  [ТС] 7
nmcf, полями - в смысле просто объявить без new?
А в чем ошибка была?

Я вот просто так до сих пор и не понял... Вот создаешь что-нибудь через new - можно удалить, память очищается.
А если не через new, то и удалить как-то нельзя... А это же плохо, память надо чистить...
0
93 / 93 / 33
Регистрация: 17.03.2012
Сообщений: 536
15.04.2017, 16:52 8
Цитата Сообщение от wlmn Посмотреть сообщение
А если не через new, то и удалить как-то нельзя... А это же плохо, память надо чистить...
Читайте про виды памяти, вот, например:
http://www.intuit.ru/studies/c... 976?page=6
Потом можно почитать про указатели, про это есть в любой книжке по с++
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.04.2017, 18:39 9
Цитата Сообщение от wlmn Посмотреть сообщение
А если не через new
То удалится вместе с содержащим объектом.

Добавлено через 1 минуту
Цитата Сообщение от wlmn Посмотреть сообщение
А в чем ошибка была?
Так она устранена или нет?
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
15.04.2017, 18:41  [ТС] 10
Так она устранена или нет?
Ну если не через ссылки, устранена.
А так нет...
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
15.04.2017, 18:44 11
Значит, проблема с выделением/освобождением памяти, а не с потоками.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
17.04.2017, 10:30 12
Цитата Сообщение от цикла Цитаты великих людей
C++ (Qt)
1
QVector<QVector<double>> *Y;
Не надо так.
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
17.04.2017, 15:10  [ТС] 13
Ну я не нашел, как QVector2D вернул бы мне ссылку на строку или столбец. А работать я буду именно с ними. И вообще если я буду писать что-нибудь типа sum(X,Y,i), имея в виду, что я хочу в сложить i-е строки Х и У и заменить этой суммой i-ю строку Х, то в кэш загрузится вся матрица Y, ну вот и нафиг оно надо...
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
17.04.2017, 15:35 14
Цитата Сообщение от так уот не надо
*
Векторы лояльны к созданию в стеке и простому приравниванию, подробнее в документации.
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
17.04.2017, 16:26  [ТС] 15
>>Ну я не нашел, как QVector2D вернул бы мне ссылку на строку или столбец.
>>Векторы лояльны к созданию в стеке и простому приравниванию, подробнее в документации.

ммм...
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
17.04.2017, 19:05 16
Цитата Сообщение от wlmn Посмотреть сообщение
Ну я не нашел, как QVector2D вернул бы мне ссылку на строку или столбец.
C++ (Qt)
1
2
3
4
5
Y[i] = QVector<double>(0.0,Jmax);
qDebug("%f", Y[i][j]);
double & Yij = Y[i][j]; // Хоп! Хей! На-на-ней!
Yij = 100;
qDebug("%f", Y[i][j]);
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
21.04.2017, 19:54  [ТС] 17
Ну так и чем плох QVector<QVector<double>>?

Почитал внимательнее QVector2D
И это воообщеее не то, что нужно. Насколько я понял, оно задает двумерный вектор (вектор на плоскости)
А мне нужен не математический вектор. Мне нужна двумерная матрица. (ну... двумерный массив. Матрица n на m)

Добавлено через 1 час 8 минут
Ну и к слову...
двухмерный вектор? Серьезно? Вместо простого QVector<double> с двумя ячейками, мы получаем несколько функций, типа нормировки вектора и нам приходится читать всю эту дичь в документации? При всем при том, что реализовать нормировку ну не сложно.
Нет, это, наверное, может быть обосновано в графических задачах, но в вычислительных, где часто размерность векторов не 2х1, а куда, куда больше, это бред сивой кобылы.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
21.04.2017, 21:10 18
wlmn, у тебя указатели на вектор. Указатели, Карл!
Это Qt аж 5. Не надо указатели на QVector. Хочешь передавать - просто приравнивай. Хочешь иметь ссылку - не создавай в своём потоке, а получай ссылку извне. Получаешь извне - используй мутексы, в любом случае нужно будет их иметь.
0
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 207
21.04.2017, 21:34  [ТС] 19
icpu, че, почему, че к чему...
Ну указатели и че? Почему не надо указателей? Почему не создавать в своем потоке, Карл.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
21.04.2017, 23:40 20
Чтобы проблемы себе не создавать.
0
21.04.2017, 23:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2017, 23:40
Помогаю со студенческими работами здесь

Деструкторы
Не совсем понятно, по какой все таки причине разработчики C++ отказались от возможности иметь...

Деструкторы
Всем доброго времени суток! Возникли некоторые непонятки с деструкторами, а точнее их время вызова...

Деструкторы
Объясните как работают деструкторы. В книге пример был и ниче не понял class Destruct { ...

Конструкторы и деструкторы
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru