Я хочу написать программу, которая будет получать некоторые данные через UDP, а затем написать необработанные байты в файл. Я думаю, что лучшим решением было бы разделить операции файлов и операции сокетов на отдельные потоки. Что вы думаете? Я не совсем уверен, что правильно выполнил операции с закрытием и чтением файлов. Проблема в том, что когда я нажимаю кнопку «Пуск», мне нужно начать получать данные, и когда я нажимаю остановку, мне нужно прекратить получать данные. Другими словами, прием данных должен быть приостановлен.class UdpClient : public QObject
{
Q_OBJECT
public:
explicit UdpClient(QObject *parent = nullptr);
~UdpClient() override;
bool listen(quint64 port);
void close();
signals:
void Received(QByteArray& arr);
private slots:
void readyRead();
private:
bool listening = false;
QUdpSocket socket;
};
< /code>
Имлеменция проста: < /p>
UdpClient::UdpClient(QObject *parent)
: QObject{parent}
{
connect(&m_socket, &QAbstractSocket::readyRead, this, &UdpClient::readyRead);
}
UdpClient::~UdpClient()
{
socket.close();
}
bool UdpClient::listen(quint64 port)
{
if (addr != socket.localAddress() || port != socket.localPort()) {
socket.close();
listening = socket.bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress);
} else {
listening = true;
}
return listening;
}
void UdpClient::close()
{
listening = false;
}
void UdpClient::readyRead()
{
if (!listening)
return;
QByteArray dgram;
while (socket.hasPendingDatagrams()) {
const auto bytesToRead = socket.pendingDatagramSize();
dgram.resize(bytesToRead);
socket.readDatagram(dgram.data(), dgram.size());
emit Received(dgram);
}
}
< /code>
file op class: < /p>
class FileWriterWorker : public QObject {
Q_OBJECT
public:
FileWriterWorker() : m_outputFile(nullptr) {}
~FileWriterWorker() override = default;
public slots:
void startWriting(const QString &fileName);
void writeData(const QByteArray &data);
void stopWriting();
signals:
void fileError(const QString &title, const QString &message);
void fileClosed(const QString &finalPath);
private:
QFile *outputFile;
};
void FileWriterWorker::startWriting(const QString &fileName) {
outputFile = new QFile(fileName);
if (!outputFile->open(QIODevice::WriteOnly)) {
emit fileError("File Error", "Could not create or open the log file for writing.");
delete outputFile;
outputFile = nullptr;
}
}
void FileWriterWorker::writeData(const QByteArray &data) {
if (outputFile && outputFile->isOpen()) {
outputFile->write(data);
}
}
void FileWriterWorker::stopWriting() {
if (m_outputFile) {
const QString savedFileName = outputFile->fileName();
outputFile->close();
delete outputFile;
outputFile = nullptr;
emit fileClosed(savedFileName);
}
}
< /code>
Я не включил код для основного класса, поскольку он содержит две кнопки и два потока, где мы перемещаем наши классы UDP и Fileop. Я не уверен, что это лучший подход. Я также не уверен, что люди все еще используют механизмы, отличные от будущего. Что ты думаешь?
Подробнее здесь: https://stackoverflow.com/questions/797 ... ve-to-file
QT - получение данных от UDP и сохранить в файл ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1754861917
Anonymous
Я хочу написать программу, которая будет получать некоторые данные через UDP, а затем написать необработанные байты в файл. Я думаю, что лучшим решением было бы разделить операции файлов и операции сокетов на отдельные потоки. Что вы думаете? Я не совсем уверен, что правильно выполнил операции с закрытием и чтением файлов. Проблема в том, что когда я нажимаю кнопку «Пуск», мне нужно начать получать данные, и когда я нажимаю остановку, мне нужно прекратить получать данные. Другими словами, прием данных должен быть приостановлен.class UdpClient : public QObject
{
Q_OBJECT
public:
explicit UdpClient(QObject *parent = nullptr);
~UdpClient() override;
bool listen(quint64 port);
void close();
signals:
void Received(QByteArray& arr);
private slots:
void readyRead();
private:
bool listening = false;
QUdpSocket socket;
};
< /code>
Имлеменция проста: < /p>
UdpClient::UdpClient(QObject *parent)
: QObject{parent}
{
connect(&m_socket, &QAbstractSocket::readyRead, this, &UdpClient::readyRead);
}
UdpClient::~UdpClient()
{
socket.close();
}
bool UdpClient::listen(quint64 port)
{
if (addr != socket.localAddress() || port != socket.localPort()) {
socket.close();
listening = socket.bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress);
} else {
listening = true;
}
return listening;
}
void UdpClient::close()
{
listening = false;
}
void UdpClient::readyRead()
{
if (!listening)
return;
QByteArray dgram;
while (socket.hasPendingDatagrams()) {
const auto bytesToRead = socket.pendingDatagramSize();
dgram.resize(bytesToRead);
socket.readDatagram(dgram.data(), dgram.size());
emit Received(dgram);
}
}
< /code>
file op class: < /p>
class FileWriterWorker : public QObject {
Q_OBJECT
public:
FileWriterWorker() : m_outputFile(nullptr) {}
~FileWriterWorker() override = default;
public slots:
void startWriting(const QString &fileName);
void writeData(const QByteArray &data);
void stopWriting();
signals:
void fileError(const QString &title, const QString &message);
void fileClosed(const QString &finalPath);
private:
QFile *outputFile;
};
void FileWriterWorker::startWriting(const QString &fileName) {
outputFile = new QFile(fileName);
if (!outputFile->open(QIODevice::WriteOnly)) {
emit fileError("File Error", "Could not create or open the log file for writing.");
delete outputFile;
outputFile = nullptr;
}
}
void FileWriterWorker::writeData(const QByteArray &data) {
if (outputFile && outputFile->isOpen()) {
outputFile->write(data);
}
}
void FileWriterWorker::stopWriting() {
if (m_outputFile) {
const QString savedFileName = outputFile->fileName();
outputFile->close();
delete outputFile;
outputFile = nullptr;
emit fileClosed(savedFileName);
}
}
< /code>
Я не включил код для основного класса, поскольку он содержит две кнопки и два потока, где мы перемещаем наши классы UDP и Fileop. Я не уверен, что это лучший подход. Я также не уверен, что люди все еще используют механизмы, отличные от будущего. Что ты думаешь?
Подробнее здесь: [url]https://stackoverflow.com/questions/79731514/qt-receive-data-from-udp-and-save-to-file[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия