Russian Qt Forum
Ноябрь 23, 2024, 07:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение вторым потоком  (Прочитано 1874 раз)
koptina
Гость
« : Февраль 14, 2018, 14:21 »

Здравствуйте.

Моя программа должна работать по схеме.

По вызову метода старт - создаётся поток, в котором есть сокет, биндящийся на порт. Вся его задача состоит в том, что он слушает и пишет пришедшие пакеты в очередь, которая является как бы буфером между ним и потоком читальщиком. Я хочу, чтобы просходило так: он пишет в очередь, другой поток забирает из очереди, что-то делает и пишет в файл. Но не могу понять, как, где и по какому принципу создать второй поток. не могу понять, как сделать так, чтобы тот всё время пытался прочитать данные из очереди.
Т.е. работать они не должны синхронно, не один за другим: первый записал, второй сразу прочитал, а асинхронно: сколько-то первый записал, второй сколько-то прочитал. Классическая задача, но если я справился с "составление буфера", то совсем не могу понять, как создать тот самый второй поток и какая у него должна быть начинка для вот постоянных попыток чтения из "буфера". Привожу код, который я написал.


Код:
#include <QCoreApplication>
#include "logikazdes.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    logikazdes server;
 
 
    return a.exec();
}


Код:
#include "logikazdes.h"
 
logikazdes::logikazdes(QObject *parent) : QObject(parent)
{
 
// ====== Поток для запис в очередь ======
    qDebug() << QObject::thread();
    QThread *thread = new QThread;
 
    writetoqueue *queue = new writetoqueue();
 
    queue->moveToThread(thread);
 
    connect(thread, SIGNAL(started()), queue, SLOT(start()));
    connect(queue, SIGNAL(finish()), thread, SLOT(quit()));
    connect(queue,SIGNAL(finish()), queue, SLOT(deleteLater()));
    connect(thread,SIGNAL(finished()),thread, SLOT(deleteLater()));
    connect(queue,SIGNAL(enqueueQueue(QByteArray)),this,SLOT(enque(QByteArray)));
 
    thread->start();
 
//======================================
 
 
}
 
void logikazdes::enque(QByteArray datagram)
{
 
    o4ered.enqueue(datagram);
    qDebug() << o4ered.size();
 
 
}

Код:
#include "writetoqueue.h"
 
writetoqueue::writetoqueue(QObject *parent) : QObject(parent)
{
 
}
 
void writetoqueue::start()
{
 
 
    socket = new QUdpSocket(this);
    socket->bind(1111);
    connect(socket, SIGNAL(readyRead()), SLOT(read()));
 
}
 
 
void writetoqueue::read()
{
    QByteArray datagram;
    while (socket->hasPendingDatagrams())
    {
        datagram.resize(socket->pendingDatagramSize());
        socket->readDatagram(datagram.data(), datagram.size());
        qDebug() << datagram;
        emit enqueueQueue(datagram);
    qDebug() << QObject::thread();
    }
 

}

Так вот как организовать работу 2 потока, который должен забирать из очереди эти данные и их обрабатывать? Желательно, ответьте кодом с пояснениями. Надеюсь задачу я понятно описал. Заранее спасибо
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Февраль 15, 2018, 12:33 »

выкидывай сигналы из потока чтения с аргументов qbytearray и лови в потоке записи
сигналы будут приходить по очереди
ничего лишнего и не надо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 22.