Ребята, хелп!
Короче, я программирую в С++, но делаю там сугубо физические расчеты, строю гистограммки. Никогда не занималась поточным программированием!
При приеме на работу задали тестовое задание, а я не знаю, как к нему подобраться..((
Задание такое:
Написать простое многопоточное приложение на 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();
}
Ну как вариант. Для каждой нити создаешь свой класс унаследованный от QThread() и запускать примерно так как сделано выше.
Но лучше для основного потока тоже сделать свой класс и только на него создать объект в функции main().
И
/* QCoreApplication a(argc, argv);
return a.exec();*/
Для замены символов наверное QString использовать?
А как создать общий основной поток? Вот я этого и не понимаю!
И еще: как правильно использовать таймер?
Сначала, бы нужно просто что-то про потоки почитать.
Вот для затравки
http://habrahabr.ru/post/150274/
Главный поток обычно создается в main(). К примеру так:
int main(int argc, char* argv[]) {
QCoreApplication a(argc, argv); // или QApplication a(argc, argv);
MainThread m; // главный поток
return a.exec();
}
Спасибо, ребята. Напишу - ввыложу. Сегодня-завтра... Нету у меня, елки, еще поточного мышления...))))
iron-cat,
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)