crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Qt с нуля, Пожалуйста, помогите мне разобраться!
iron-cat
  опции профиля:
сообщение 5.3.2014, 20:33
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 5.3.2014
Пользователь №: 4071

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




Репутация:   0  


Ребята, хелп!

Короче, я программирую в С++, но делаю там сугубо физические расчеты, строю гистограммки. Никогда не занималась поточным программированием!

При приеме на работу задали тестовое задание, а я не знаю, как к нему подобраться..((

Задание такое:

Написать простое многопоточное приложение на C/C++, которое бы делало следующее:



1) в основном потоке читает непрерывно какую-либо информацию (например, текст из файла) и показывает его

2) сразу после запуска порождает несколько нитей. В процессе чтения информации каждой из нитей посылается текущий блок данных (очередная порция текста). Каждая нить выполняет определенное действие с пришедшей информацией (например, одна нить дублирует каждый символ, а вторая удаляет первый символ), и возвращает результат в основной поток, в котором демонстрируется результаты работы каждой нити.

3) Для оценки работы многопоточности нужно предусмотреть определенную задержку обработки каждой порции информации для каждой из нитей (вставить явно временную задержку у нити).



По сути это эмулятор программы онлайн обработки информации: читается непрерывно например видеопоток, и разные модули с разной скоростью обработки делают с каждым кадром определенные действия, при этом в главном потоке не должно быть задержек с просмотром ”сырой” информации.



Вот... Скачала и установила в убунту qt5.2, создала проект, файлы с расширением h,cpp и pro. Читала про класс QThreads, но так и не знаю, как мне к заданию подобраться!!! Какое-то все мудреное... Я так и не усвоила смыслы потоков... По-своему я бы просто тупо макрос в С++ написала, исмпользуя только классы String и File, но боюсь, работодателей такое не устроит... Помогите кто чем может! Не умею я одна с литературой работать пока...((

Начала писать код... Наверное бред пишу... Не знаю... Как правильно написать две нитки и их связь с основным потоком??? И поправляйте меня!

#include <QCoreApplication>
#include <QThread>
#include <QFile>
#include <QDebug>
#include <QByteArray>
#include <QString>

class MainThread : public QThread
{

public:
    void run ()
    {
        //Код, исполняемый в потоке
        QFile file("file.txt"); // создаем объект класса QFile
        QByteArray data; // Создаем объект класса QByteArray, куда мы будем считывать данные
        if (!file.open(QIODevice::ReadOnly)) // Проверяем, возможно ли открыть наш файл для чтения
            return; // если это сделать невозможно, то завершаем функцию
        data = file.readAll(); //считываем все данные с файла в объект data
        qDebug() << QString(data); // Выводим данные в консоль, предварительно создав строку из полученных данных
    
    }
}

class MyThread1 : public QThread
{
     Q_OBJECT

protected:
     void run();
};

void MyThread1::run()
{
    
}
int main(int argc, char *argv[])
{
   /* QCoreApplication a(argc, argv);

    return a.exec();*/
    MainThread thread;
    thread.start();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 6.3.2014, 18:55
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

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




Репутация:   0  


Ну как вариант. Для каждой нити создаешь свой класс унаследованный от QThread() и запускать примерно так как сделано выше.
Но лучше для основного потока тоже сделать свой класс и только на него создать объект в функции main().

И
/* QCoreApplication a(argc, argv);

return a.exec();*/


следует раскоментировать.

Взаимодействие между потоками можно реализовывать с помощью сигналов и слотов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Анна_*_*
сообщение 7.3.2014, 12:23
Сообщение #3





Гости








    


Для замены символов наверное QString использовать?

А как создать общий основной поток? Вот я этого и не понимаю!

И еще: как правильно использовать таймер?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 7.3.2014, 13:53
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Сначала, бы нужно просто что-то про потоки почитать.
Вот для затравки
http://habrahabr.ru/post/150274/
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Анна_*_*
сообщение 7.3.2014, 14:12
Сообщение #5





Гости








    


Цитата(smartchecker @ 7.3.2014, 13:53) *
Сначала, бы нужно просто что-то про потоки почитать.
Вот для затравки
http://habrahabr.ru/post/150274/


Я почитала, спасибо. Я уже 3 дня читаю про потоки, но как в них загонять информацию не пойму!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 7.3.2014, 14:43
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

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




Репутация:   0  


Главный поток обычно создается в main(). К примеру так:
int main(int argc, char* argv[]) {
    QCoreApplication a(argc, argv); // или QApplication a(argc, argv);
    MainThread m; // главный поток
    return a.exec();
}


то есть a.exec() создает поток, в данном случае главный поток.

Передавать инфу между потоками можно с помощь сигналов и слотов или высылки событий QCoreApplication::postEvent() и QCoreApplication::sendEvent().
Как по мне первый вариант лучше.

А что с таймером не так?
Для запуска, остановки используется QTimer::start() QTimer::stop().
Раз в цикл таймер посылает сигнал QTimer::timeout(), который надо прикрутить к слоту, который выполняет определенное действие по таймеру.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Анна_*_*
сообщение 8.3.2014, 12:33
Сообщение #7





Гости








    


Спасибо, ребята. Напишу - ввыложу. Сегодня-завтра... Нету у меня, елки, еще поточного мышления...))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.3.2014, 4:30
Сообщение #8


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

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

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




Репутация:   94  


iron-cat,
Цитата(Trisch @ 7.3.2014, 16:43) *
Главный поток обычно создается в main()
Он не "обычно" в main() создаётся. А сама функция main() выполняется в главном потоке приложения.
Вообще последняя рекомендация по потокам в Qt - совать объекты в поток с помощью moveToThread(), вместо создания наследников от QThread.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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