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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 [2] 3 4 ... 26
16  Программирование / Общий / Re: Как перегнать QBitArray в QByteArray ? : Сентябрь 07, 2012, 15:39
Может кому-то пригодиться.

Конвертация QByteArray -> QBitArray

Код:
QByteArray bytes = ...;
 
// Create a bit array of the appropriate size
QBitArray bits(bytes.count()*8);
 
// Convert from QByteArray to QBitArray
for(int i=0; i<bytes.count(); ++i)
    for(int b=0; b<8; ++b)
        bits.setBit(i*8+b, bytes.at(i)&(1<<b));

Обратная конвертация QBitArray -> QByteArray

Код:
QBitArray bits = ...;
 
// Resulting byte array
QByteArray bytes;
 
// Convert from QBitArray to QByteArray
for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(b%8)));
17  Qt / Многопоточное программирование, процессы / Re: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 25, 2012, 21:02
Боялся что могут быть глюки. Но все работает.
В общем зациклился на оптимизации Улыбающийся
Думаю действительно нет разницы.
Всем спасибо за общение Улыбающийся
Иду программировать дальше..
18  Qt / Многопоточное программирование, процессы / Re: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 22, 2012, 13:17
Самое простое решение - поток менеджер, имеющий указатели на все потоки, принимающий сигнал с 2 параметрами - номер потока куда передать и данные. Всё.

Да у меня в основном потоке есть указатели на все потоки.
Если соединять Тред=>Главный сигнал слотом то данные передадутся.
Но надо их еще обратно передавать в другой тред и чтобы обойтись без мютексов придется еще делать соединение Главный=>Тред чтобы послать данные в другой тред.
В итоге будет соединений в двое больше чем тредов.

В моем методе есть только одно соединение внутри треда, и одно внутри главного потока.
Выходит если по моему тогда получится соединений столько же сколько тредов + еще одно в главном потоке.
Получается что так делать оптимизированнее.
19  Qt / Многопоточное программирование, процессы / Re: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 22, 2012, 03:16
Предлагать среди вариантов метод, который непонятен отвечающему - это пять:)
Вопрос скорее к всем.
Но отвечающий пусть тоже свою версию оптимальной реализации скажет Улыбающийся
20  Qt / Многопоточное программирование, процессы / Re: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 21, 2012, 23:08
Я тут не вижу явных преимуществ перед просто сигналом Улыбающийся

Представьте что у вас есть 10000 объектов разбросанных в разных тредах.
Вам надо передать данные из одного то в другой само собой методом сигнал слота чтобы не тормозить треды.

Как вы бы это реализовали?
  • Зарание соеденить всевозможные пары этих объектов?
  • Делать connect и disconnect пар объектов при обращениях?
  • Или тем методом которым я сделал (хотя вы его не поняли..)?
21  Qt / Многопоточное программирование, процессы / Re: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 21, 2012, 15:11
Как говорил один человек - если в программе больше 20 потоков - это плохая программа Веселый
Да это правда, но в проге есть число потоков только в двое больше чем количество ядер.
И данные будут передаваться от объекта к объекту которые принадлижат разным тредам.
Суть дела не меняется.
22  Qt / Многопоточное программирование, процессы / Re: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 21, 2012, 11:38
эффект/оптимизация те же самые как если бы ThreadA испустила сигнал.
По поводу оптимизации тоже думаю что нет разницы.
В итоге получилась конструкция (new QThread)->sendData(..) которая вызывает сигнал по функции из другого треда.
И у каждого QThread есть указатель на главный QThread, данные передаются в последний этим методом а потом определяется в который QThread отправить их дальше, и тоже по указателю так делается.

В результате сигнал со слотом соединены только внутри каждого объекта самому к себе и нет надобности соединять сигнал со слотом всех остальных тредов.

А как бы вы реализовали передачу данных между 1000 штук QThread (или просто QObject)?
Разве удобно создавать между всеми ими связь?
23  Qt / Многопоточное программирование, процессы / Re: QThread. Безопасно ли так делать? : Июль 21, 2012, 11:06
Это может быть thread-safe или нет в зависимости от содержания ThreadB::functionSendData. Вот пример когда нет

Функция functionSendData создана только для того чтобы запустить сигнал с данными.
Там будет только одна строчка как в примере.
А обработка данных только в slotSendData.
Это разве не ThreadSafe?
24  Qt / Многопоточное программирование, процессы / Re: QThread. Безопасно ли так делать? : Июль 21, 2012, 03:31
Подумал и обобщил вопрос.
Есть два треда ThreadA и ThreadB. У первого есть указатель на второй.
Надо передавать данные из А в В без сигналов слотов между ThreadA и ThreadB так чтобы это было ThreadSafe и не тормозило треды.
И да, код слота slotSendData есть ThreadSafe и он обрабатывает данные и может отправить их в другой тред.
Прилагаю файлы с примером как я это сделал.

Есть множество тредов (или объектов в разных тредах) между которыми надо передавать данные в QByteArray.
Я сделал так что каждый объект сбрасывает данные в главный тред и там определяется куда его отправить дальше (в другой тред).
Думаю нельзя соединить много объектов сигналами во всех комбинациях поэтому так делаю.


Алгоритм кратко:
1) ThreadA по указателю вызывает функцию functionSendData из ThreadB
2) в функции functionSendData вызывается сигнал signalSendData который соединен со слотом в этом же ThreadB
3) обрабатывается слот slotSendData изпод ThreadB
Выходит ThreadA по сигналу запускает слот в ThreadB и при этом нет явного соединения ThreadA<=>ThreadB и любой тред может обратится к другому без предварительного connect к нему.
Скажите оптимально ли это реализовано?

main.cpp
Код:
#include <QtGui/QApplication>
#include "threada.h"
#include <QDebug>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug()<<"START ============================";

qDebug()<<"Main Thread ID: "<<a.thread()->currentThreadId();
ThreadB threadB;
ThreadA threadA(&threadB);

return a.exec();
}

threada.h
Код:
#ifndef THREADA_H
#define THREADA_H

#include <QThread>
#include "threadb.h"

class ThreadA : public QThread
{
Q_OBJECT

public:
ThreadA(ThreadB*);
void run();

private:
ThreadB *threadB;
};

#endif // THREADA_H

threada.cpp
Код:
#include "threada.h"
#include <QDebug>

ThreadA::ThreadA(ThreadB *thB)
: QThread()
{
threadB=thB;
moveToThread(this);
start();
}

void ThreadA::run()
{
QByteArray dataToSend="HELLO WORLD!";
qDebug()<<"functionSendData("+dataToSend+") From "<<currentThreadId();
threadB->functionSendData(dataToSend);
//exec();
}

threadb.h
Код:
#ifndef THREADB_H
#define THREADB_H

#include <QThread>

class ThreadB : public QThread
{
Q_OBJECT

public:
ThreadB();

void functionSendData(QByteArray);

private slots:
void slotSendData(QByteArray);
signals:
void signalSendData(QByteArray);
};

#endif // THREADB_H

threadb.cpp
Код:
#include "threadb.h"
#include <QDebug>
#include <QCoreApplication>

ThreadB::ThreadB()
: QThread()
{
connect(this,SIGNAL(signalSendData(QByteArray)),this,SLOT(slotSendData(QByteArray)));
moveToThread(this);
start();
}

void ThreadB::slotSendData(QByteArray data)
{
//чтото делать с данными
qDebug()<<"slotSendData("+data+") From "<<currentThreadId();
qDebug()<<"END ============================";
QCoreApplication::quit();
}

void ThreadB::functionSendData(QByteArray data)
{
qDebug()<<"signalSendData("+data+") From "<<currentThreadId();
emit signalSendData(data);
}

Вывод Debug
Код:
Main Thread ID: 0x1af4 
functionSendData(HELLO WORLD!) From 0x1f6c
signalSendData(HELLO WORLD!) From 0x1f6c
slotSendData(HELLO WORLD!) From 0x1e34
25  Qt / Многопоточное программирование, процессы / Re: Безопасно ли так делать? : Июль 20, 2012, 22:50
Попробую объяснить подробнее..
Есть несколько тредов, 8 например.
И динамически создаются объекты наследники QObject при этом каждый перемещается в один из тредов и никогда не удаляется.
Каждый объект должен посылать данные QByteArray в "главный" поток.
Хочу избежать создания множества пар сигнал слотов при добавлении нового объекта в тред.
Это не критично но упростит понимание и является оптимизацией (или нет?).
Значит:
1) у каждого объекта есть указатель на "главный"
2) в "главном" объекте есть метод (не слот) в котором инициируется сигнал соединенный с слотом "главного" объекта.
Сигнал инициируется в треде и так думаю в результате должен запустится слот в "главном" объекте, будет ли это threadsafe?
26  Qt / Многопоточное программирование, процессы / Передача данных между QThread без сигнал-слотов. Безопасно ли так делать? : Июль 20, 2012, 01:48
Есть главный класс наследник QObject в котором есть слот someSlot() и сигнал initSomeSlot() который тоже в этом объекте.
Есть множество запущенных QThread наследников и у каждого из них есть указатель на главный QObject.
Безопасно (thread safe) ли вызывать внутри QThread по указателю метод из основного QObject который инициализирует сигнал initSomeSlot()?
Делается это чтобы не тормозить поток в главном QObject и чтобы не делать кучу connect для каждого QThread.
27  Qt / Qt Quick / Re: Как узнать что qml-элемент уже создался : Апрель 29, 2012, 16:48
а если по сигналу Component.onCompleted: флаг "создался" менять или сигнал парента инициализировать?
28  Qt / Вопросы новичков / Re: QGraphicsView как сделать прозрачный фон? : Апрель 29, 2012, 16:28
Можно и короче (: setStyleSheet("background-color: transparent");
29  Qt / Qt Quick / Re: Как сделать Image светлым при наведении? : Апрель 29, 2012, 16:05
Еще вариант подставить под Image еще Rectangle c белым цветом, тогда крутить opaticy в Image до 0.8 и будет картинка светлее Улыбающийся

Код:
    MouseArea
    {
        hoverEnabled: true
        implicitWidth: topImage.implicitWidth
        implicitHeight: topImage.implicitHeight

        onEntered: topImage.opacity=0.8
        onExited: topImage.opacity=1.0

        Rectangle {anchors.fill: parent; color: "white"}

        Image
        {
        id: topImage
        source: "./Image.png"
        Behavior on opacity {PropertyAnimation {easing.type: Easing.OutCurve; property: "opacity"; duration: 200; }}
        }
    }
30  Qt / Qt Quick / Re: QML проверка существования пути файла : Апрель 29, 2012, 15:57
ДА, но он будет не Error...
Но все-же будет всегда одинаковым пока картинке соурс не присвоить?
Ваш метод почему-то не работает, и я не понимаю как это должно работать, но интересно бы разобраться.
Одним словом проблема решена Улыбающийся
Страниц: 1 [2] 3 4 ... 26

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