crossplatform.ru

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

6 страниц V  « < 2 3 4 5 6 >  
Ответить в данную темуНачать новую тему
> многопоточность QThread
eldar85
  опции профиля:
сообщение 21.6.2010, 14:25
Сообщение #31


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

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

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




Репутация:   0  


если не сделать
thread[n].wait();

то поток просто убивается не доработав до конца, а тут запускается ожидание пока поток не будет закончен, в принципе работает нормально в таком плане...
я не говорил что мне нужно закрыть окно, я имел вввиду что оно виснет пока потоки не выполнят все действия до конца. я даже не могу перетащить окно, оно висит пока не будет все выполнено.
а Sleep(10); это просто чтобы между потоками какой то маленький промежуток был, хотя это не обязательно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 21.6.2010, 14:28
Сообщение #32


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(eldar85 @ 21.6.2010, 15:25) *
если не сделать
thread[n].wait();

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

Этот код, как раз и блокирует главный (GUI) поток, до тех пор, пока не отработают все запущенные потоки.
Определись/разберись, что тебе нужно, и либо убери этот цикл (потоки будут работать!) или терпи блокирование GUI.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 21.6.2010, 14:37
Сообщение #33


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

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

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




Репутация:   0  


убрав второй цикл все потоки тут же убиваются после того как закончиться первый цикл и все, получается просто ничего не работает. если убрать из ран() ожидание в 10 сек, то конечно все почти нормально, и то в консоли пишет что потоки убиты до того как они были закончены.
а если у меня в ран будет что то очень долго выполняться то поток просто будет убит ничего не сделав...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 21.6.2010, 14:39
Сообщение #34


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(eldar85 @ 21.6.2010, 15:37) *
убрав второй цикл все потоки тут же убиваются после того как закончиться первый цикл и все, получается просто ничего не работает. если убрать из ран() ожидание в 10 сек, то конечно все почти нормально, и то в консоли пишет что потоки убиты до того как они были закончены.
а если у меня в ран будет что то очень долго выполняться то поток просто будет убит ничего не сделав...

Потому что объекты Thread нужно создавать в куче (используя new), а не на стеке!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 21.6.2010, 19:40
Сообщение #35


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

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

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




Репутация:   0  


большое вам спасибо, наконец то получилось)))
вот код
Thread *thread = new Thread[10];

for( int n = 0; n < 10; n++)
    {
    thread[n].start();

    }

и главное окно не виснет, полностью активно пока выполняется процесс)))) еще раз спасибо)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 25.6.2010, 10:26
Сообщение #36


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

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

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




Репутация:   0  


все же сложность одна осталась с многопоточностью, я никак не пойму как можно сделать так чтобы метод ран использовал главное окно для вывода на него информации:
сделал функцию для вывода на экран vivod(), в функции knopka() по нажатию кнопки запускается процесс, получается метод run() это другой класс Thread, а остальные все объекты относятся к классу mainWidow, возможно очень глупый вопрос, согласен, но я уже перерыл много инфы и что только не попробывал и никак не дойдет как же сделать из метода run() запуск функции vivod().
и пробывал vivod() сделать функцией другом в классе Thread friend void mainWindow::vivod(); но реакции ноль...
помогите разобраться, ну никак не разберусь...

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

void mainWidoww::knopka()
{
    Thread *thread = new Thread[10];
    for(g=0; g<10; g++)
    {
        thread[g].start();
        Sleep(100);
    }
}

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

void Thread::run()
{
                 //вот тут как поместить функцию vivod() ?????


    qDebug() << "gggg";
}


вот в документации приводится пример
void MyThread::run()
{
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
}


получается тут в каждом потоке объявляется новый объект QTcpSocket socket;
я так же делал со своим объектом и в консоли вывод что один и тот же объект уже был создан в другом потоке


вот так попробывал
void Thread::run()
{
    mainWindow main;
main.vivod("fff");


    qDebug() << "gggg";
}


в итоге консоль выдала:

QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
gggg
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
gggg
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
gggg

.............................................

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


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

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

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




Репутация:   34  


Цитата
чтобы метод ран использовал главное окно для вывода на него информации


[offtop]
довольно кровавый метод... (Хотя, мы тут в обливионе и не такое творим...)
[/offtop]

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

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


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

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

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




Репутация:   0  


да я тоже думал об этом, только не совсем разберусь как это сделать...
получается в главном окне слот нужно сделать pablic slots???
и еще впрос, какой сигнал кидать в потоке??? я сильно путаюсь еще в сигналах...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.6.2010, 10:42
Сообщение #39


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

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

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




Репутация:   34  


eldar85, там вроде пофиг, приватный он или открытый, точно не помню.

А путаешься в них зря - типы функций сигнала и слота должны быть одинаковые, вот и всё

Перед запуском потока нужно connect его сигнал со слотом главного окна

(С сигналами тут вообще многое упрощается :) В студии приходится передавать в поток указатель на внешний объект)

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


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

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

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




Репутация:   0  


вот создал я паблик слот в главном окне

public slots:
         void vivod(QString str);


затем в срр его описал
void mainWindow::vivod(QString str)
{
    ui->textEdit->append(str);
}



и теперь метод run()

void Thread::run()
{
   connect()  //вот тут я не пойму что именно будет давать сигналы моему слоту


    qDebug() << "gggg";

}


можете объяснить???

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

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


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




RSS Текстовая версия Сейчас: 29.4.2024, 18:15