crossplatform.ru

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


  Ответ в многопоточность QThread
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
wolf.diesel Дата 14.7.2010, 17:56
  Пардон, неправильно выразился
QtConcurrent - подобных библиотек.
Я согласен, что метод мной приведенный работает далеко не всегда и, все ж таки, придется юзать мьютексы и прочие прелести тредов, но то, что я написал, хотя бы, даст пинка мысли )
Начало. Ато человек вконец запутался, как я посмотрел )
Алексей1153 Дата 13.7.2010, 18:26
 
Цитата(wolf.diesel @ 13.7.2010, 12:29) *
без применения всяких вытесняющих технологий

а что за технологи такие ? :)
wolf.diesel Дата 13.7.2010, 9:29
  Вообще, чтобы небыло подобных вопросов о межпроцессном взаимодействии, уясни одну вещь: каждый поток выполняется в своем пространстве и со своей памятью.
Чтобы изменить ЛЮБЫЕ данные ЛЮБОГО потока твоей аппликухи, ты должен использовать ПОТОКОБЕЗОПАСНЫЕ методы.
Это касается не только кути фреймворка. Это стандарт.

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

Далее, при создании потока ты будешь делать connect(thread, SIGNAL(метод_который_описан_как_сигнал(record *)), widget, SLOT(слот_описанный_тобой_для_компонента_или _формы(recod *));
обрати внимание, что слот и сигнал имеют в параметре одинаковый тип данных(!).
А далее, в слоте уже делай с данными все, что пожелаешь. Можешь даже уничтожить, не читая :D :D :D

Это называется потокобезопасное программирование, без применения всяких вытесняющих технологий )

Только помни, что данные, которые ты передаешь между потоками должны быть созданы в куче, а не в стеке. То есть
record * rec = new record();


Ну и позаботиться об удалении, после использования неплохо бы:
delete rec;


Надеюсь, идея понятна )
wiz29 Дата 28.6.2010, 15:26
 
Цитата(eldar85 @ 18.4.2010, 2:10) *
т.е. если у меня двух ядерник, то лучше всего не более двух потоков использовать, я правельно понял?)))

Используй QtConcurrent чтобы не заморачиваться на вычисление оптимального числа потоков
Алексей1153 Дата 26.6.2010, 5:17
 
Цитата(eldar85 @ 26.6.2010, 0:39) *
поставил за одно в него qApp->procecEvent():

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

QApplication::processEvents();

вернее, даже

QCoreApplication::processEvents();
eldar85 Дата 25.6.2010, 21:39
  а все, я разобрался почему))) дело было в том что я ставил ожидание в секунду в цикле запуска потоков, в итоге главное окно ждало когда закончиться цикл и только после этого обновляло окошко ... если ожидание из цикла убрать и поставить в метод run() то тогда все cool...
да проект то и так не сложный, примерно так как вы и сказали, одна кнопка, одно текстовое поле и класс для потоков...
главное что я понял что задерживало вывод в тектовое поле, это долбынный цикл)) и поставил за одно в него qApp->procecEvent(): вот и все))
большое спасибо за помощ))
Litkevich Yuriy Дата 25.6.2010, 20:42
  eldar85, ты всё же сделай примитивный проект, окно с кнопкой и меткой, при нажатии на кнопку в метку помести текст "начали", затем запускай потоки, которые что-то будут делать, например большие циклы. По завершении потоков выводи в метку "закончили".
Если с таким приложением будут проблемы - выкладывай в форум.
Алексей1153 Дата 25.6.2010, 20:16
  попробуй processEvents()

void Thread::run()
{

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

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

eldar85 Дата 25.6.2010, 20:10
  все работает отлично, вот только еще с одним бы разобраться, допустим я запустил десять потоков в таком плане


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 сек то на текстовое поле нифига ничего не выводиться... только когда все потоки все сделают...
Алексей1153 Дата 25.6.2010, 19:55
  Ага, вижу косяк, спецификатор доступа не переопределил
public signals:
    void vivod(QString str);

public://<<<
    void run();
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:55