crossplatform.ru

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

6 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> многопоточность QThread
eldar85
  опции профиля:
сообщение 12.4.2010, 13:56
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


пробую написать простенькую многопоточную программку, но она выдает сообщение об ошибке

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 22fe34. Receiver '' (of type 'QProgressBar') was created in thread 5d70b8", file kernel\qcoreapplication.cpp, line 347
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 22fe28. Receiver '' (of type 'QProgressBar') was created in thread 5d70b8", file kernel\qcoreapplication.cpp, line 347
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

вот пример кода

#include <QApplication>
#include <QLabel>
#include <QtGui>

#include "thread.h"



int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
  
    QProgressBar *bar1 = new QProgressBar;
    QProgressBar *bar2 = new QProgressBar;
    
   MyThread thread1(bar1);
   MyThread thread2(bar2);
   thread1.start(QThread::NormalPriority);
   thread2.start(QThread::LowPriority);

    
bar1->show();
bar2->show();
    return app.exec();
}


thread.h

#ifndef THREAD_H
#define THREAD_H
#include <qapplication.h>
#include <qthread.h>
#include <qprogressbar.h>
#include <qgridlayout.h>
#include <qlabel.h>

// ======================================================================
class MyThread : public QThread {
    QProgressBar* m_pprb;

public:
    MyThread(QProgressBar* pprb) : QThread()
                                 , m_pprb(pprb)
    {
    }

    void run()
    {
        for(int i = 0; i <= 100000000; ++i) {
            m_pprb->setValue(i / 1000000);
        }
    }
};


#endif // THREAD_H


ну и про файл

SOURCES += main.cpp
CONFIG        += qt warn_on release thread
TARGET        = Threads
TEMPLATE    = app
HEADERS += thread.h


окно выскакивает с такой ошибкой:
this applicatoin has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

правда в книге вот эта строка
m_pprb->setValue(i / 1000000);

выглядела так:
m_pprb->setProgress(i / 1000000);

но setProgress не существует, похоже она была чем то заменена))

Сообщение отредактировал eldar85 - 12.4.2010, 14:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 12.4.2010, 14:39
Сообщение #2


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


капец, разобрался почему не работает))))
у меня в файле про указано
CONFIG        += qt warn_on release thread

а я компилил в дебаге)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 12.4.2010, 15:21
Сообщение #3


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


хоть программа и работает, но все же примерно через раз вылетает, предлогая закрыть программу...
в чем может быть проблема?)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fsMark
  опции профиля:
сообщение 12.4.2010, 15:55
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

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




Репутация:   1  


Цитата(eldar85 @ 12.4.2010, 16:21) *
хоть программа и работает, но все же примерно через раз вылетает, предлогая закрыть программу...
в чем может быть проблема?)



Все операции с GUI надо выполнять в основном потоке, в твоем случае дополнительный поток например может слать сигнал прогресбару находящемуся в основном потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 12.4.2010, 17:10
Сообщение #5


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


так в GUI не катит многопоточность??? а если второй поток будет выполняться выводя на экран уже в по окончанию работы ??? так нормально будет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 17:13
Сообщение #6


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

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

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




Репутация:   94  


Цитата(eldar85 @ 12.4.2010, 21:10) *
так в GUI не катит многопоточность???
Цитата(eldar85 @ 12.4.2010, 21:10) *
выводя на экран
выод на экран - рисование

подробности тут: Рисование в потоках
Ну а графический интерфейс, он нарисован.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 12.4.2010, 20:23
Сообщение #7


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


спасибо) буду изучать и пробывать))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 16.4.2010, 21:39
Сообщение #8


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


мне вот интересно, а сколько потоков допустимо за раз запускать, чтобы комп не начинал пыхтеть как ошпаренный?))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 16.4.2010, 21:56
Сообщение #9


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(eldar85 @ 16.4.2010, 22:39) *
мне вот интересно, а сколько потоков допустимо за раз запускать, чтобы комп не начинал пыхтеть как ошпаренный?))


По количеству ядер на проце. Выше этого числа уже прироста не будет никакого, только бесполезная трата оперативки и расходы на переключение между потоками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 18.4.2010, 2:10
Сообщение #10


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


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

6 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 29.3.2024, 17:32