crossplatform.ru

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

6 страниц V  « < 3 4 5 6 >  
Ответить в данную темуНачать новую тему
> многопоточность QThread
Алексей1153
  опции профиля:
сообщение 25.6.2010, 10:53
Сообщение #41


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

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

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




Репутация:   34  


нет, как-то вот так
class MyThread: .... (главное, что public QObject)
{
    Q_OBJECT

public signals:
    void vivod(QString str);

public://<<<
    void run();

};

class CMainWin: .... (главное, что public QObject)
{
    Q_OBJECT

public slots:
    void vivod(QString str);

public://<<<
    void knopka();

};



void CMainWin::knopka()
{
    Thread *thread = new MyThread[10];
    for(g=0; g<10; g++)
    {
        connect(&MyThread[g],MyThread.vivod , this, vivod);

        thread[g].start();
        Sleep(100);
    }
}


void MyThread::run()
{
    emit vivod("12345");
}


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

Сообщение отредактировал Алексей1153 - 25.6.2010, 20:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 25.6.2010, 11:13
Сообщение #42


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

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

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




Репутация:   0  


большое спасибо, сейчас буду пробывать, потом отпишусь))))

нет, получается вообще чет непонятное, он на сигнал vivod() из Thread ругается теперь
first defined heremultiple definition of `Thread::vivod1(QString)'
multiple definition of `Thread::run()'
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.6.2010, 11:26
Сообщение #43


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

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

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




Репутация:   34  


eldar85, я не знаю иерархию твоих инклудов. Прицепил бы проект ? )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 25.6.2010, 14:55
Сообщение #44


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

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

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




Репутация:   0  


спасибо тебе за совет, все получилось))))))))))))))))
ошибка была в твоем коде лишь в том что ты метод run() сделал как сигнал, его нужно просто объявлять как обычную функцию, а остальное все отлично, еще раз спасибо, наконец то хоть что то прояснилось, да еще и почитал про сигналы со слотами побольше... я как то им мало придавал значения... это было моей глупостью)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.6.2010, 19:55
Сообщение #45


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

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

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




Репутация:   34  


Ага, вижу косяк, спецификатор доступа не переопределил
public signals:
    void vivod(QString str);

public://<<<
    void run();


Сообщение отредактировал Алексей1153 - 25.6.2010, 19:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 25.6.2010, 20:10
Сообщение #46


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

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

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




Репутация:   0  


все работает отлично, вот только еще с одним бы разобраться, допустим я запустил десять потоков в таком плане


void mainWindow::vivod(QString str)
{
    ui->textEdit->append(str);
}

void mainWindow::knopka()
{
    Thread *thread = new Thread[10];

    for(g=0; g<10; g++)
    {
        connect(&thread[g],SIGNAL(vivod1(QString)), this, SLOT(vivod(QString)));
        WOW = "good ";
        WOW.append(QString::number(g));

        thread[g].start();
        Sleep(1000);
    }
}

//===============================================================================

void Thread::run()
{

emit vivod1(WOW);


    qDebug() << "gggg";

}


так вот, в текстовое поле все выводиться лишь после того как все потоки закончатся, а нельзя ли сделать так чтобы поток выполнил свое действие и вывел на экран свое значение, и так далее, а то к примеру у меня один поток может выполняться 2 секунды, а другой возможно несколько минут и тогда получиться что они друг друга будут ожидать пока все не закончаться, а если их сделать 20...100 то вообще как то будет не к стати... может знаете как так сделать???
я тут в цикле специально секунду поставил ожидание, чтобы посмотреть как будет выводиться и вот и вышло что пока не пройдет 10 сек то на текстовое поле нифига ничего не выводиться... только когда все потоки все сделают...

Сообщение отредактировал eldar85 - 25.6.2010, 20:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.6.2010, 20:16
Сообщение #47


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

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

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




Репутация:   34  


попробуй processEvents()

void Thread::run()
{

    emit vivod1(WOW);
    qDebug() << "gggg";//<<ещё бы штамп времени сюда бацнуть )))

    /*QApplication::*/processEvents(); //<<< обработать сообщения
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.6.2010, 20:42
Сообщение #48


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

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

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




Репутация:   94  


eldar85, ты всё же сделай примитивный проект, окно с кнопкой и меткой, при нажатии на кнопку в метку помести текст "начали", затем запускай потоки, которые что-то будут делать, например большие циклы. По завершении потоков выводи в метку "закончили".
Если с таким приложением будут проблемы - выкладывай в форум.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 25.6.2010, 21:39
Сообщение #49


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

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

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




Репутация:   0  


а все, я разобрался почему))) дело было в том что я ставил ожидание в секунду в цикле запуска потоков, в итоге главное окно ждало когда закончиться цикл и только после этого обновляло окошко ... если ожидание из цикла убрать и поставить в метод run() то тогда все cool...
да проект то и так не сложный, примерно так как вы и сказали, одна кнопка, одно текстовое поле и класс для потоков...
главное что я понял что задерживало вывод в тектовое поле, это долбынный цикл)) и поставил за одно в него qApp->procecEvent(): вот и все))
большое спасибо за помощ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 26.6.2010, 5:17
Сообщение #50


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

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

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




Репутация:   34  


Цитата(eldar85 @ 26.6.2010, 0:39) *
поставил за одно в него qApp->procecEvent():

кстати, функция статическая, можно

QApplication::processEvents();

вернее, даже

QCoreApplication::processEvents();

Сообщение отредактировал Алексей1153 - 26.6.2010, 5:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.4.2024, 22:26