Как испустить сигнал перекрестного потока в QT?

Вы можете использовать метод Lodash differenceBy и пропустить id prop, если хотите найти разницу на основе id. В противном случае вы можете использовать _.differenceWith(prev, next, _.isEqual)

const prev = [{"id":1},{"id":2},{"id":3},{"id":4}]
const next = [{"id":1},{"id":2},{"id":4}]

const diff = _.differenceBy(prev, next, 'id')
console.log(diff)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

На случай, если вы захотите проверить разные ключи или имена идентификаторов. Вы можете использовать differenceWith и передать пользовательскую функцию проверки равенства.

const prev = [{"id":1},{"id":2},{"id":3},{"id":4}]
const next = [{"contact_id":1},{"contact_id":2},{"contact_id":4}]

const checkId = (prev, next) => {
  return prev.id == next.contact_id
}

const diff = _.differenceWith(prev, next, checkId)
console.log(diff)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

58
задан Louis Langholtz 6 January 2018 в 19:39
поделиться

1 ответ

Существует довольно много проблем с Вашим кодом:

  • как сказанный Evan испускать ключевое слово отсутствует
  • все Ваши объекты, живые в основном потоке, только код в методах выполнения, живых в других потоках, что означает, что слот MySlot назвали бы в основном потоке, и я не уверен, что это - то, что Вы хотите
  • , Ваш слот никогда не будут называть, так как основной цикл событий никогда не не будет запущенный: Ваши два вызова для ожидания () будут только тайм-аут после очень долгого времени (и Вы, вероятно, уничтожите свое приложение, прежде чем это произойдет), и я не думаю, что это - то, что Вы хотите также, так или иначе у них действительно есть быть бесполезное в Вашем коде.

Этот код, скорее всего, работал бы (хотя я не протестировал его), и я думаю, что он делает то, что Вы хотите, чтобы он сделал:

class MyObject : public QObject
{
    Q_OBJECT
public slots:
    void MySlot( void )
    {
        std::cout << "slot called" << std::endl;
    }
};

class CThread1 : public QThread
{
    Q_OBJECT
public:
    void run( void )
    {
        std::cout << "thread 1 started" << std::endl;
        int i = 0;
        while(1)
        {
           msleep( 200 );
           i++;
           if(i==1000)
              emit MySignal();
        }
    }
signals:
    void MySignal( void );
};

class CThread2 : public QThread
{
    Q_OBJECT
public:
    void run( void )
    {
        std::cout << "thread 2 started" << std::endl;
        exec();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CThread1 oThread1;
    CThread2 oThread2;
    MyObject myObject;
    QObject::connect( & oThread1, SIGNAL( MySignal() ),
        & myObject, SLOT( MySlot() ) );
    oThread2.start();
    myObject.moveToThread(&oThread2)
    oThread1.start();
    return a.exec();
}

Теперь MyObject будет жить в thread2 (благодаря moveToThread).

MySignal должен быть отправлен от thread1 (думал, что я не уверен в том, он мог бы быть отправлен от основного потока, он действительно не имеет значения).

Никакой цикл событий не необходим в thread1 начиная с испускания сигнала, не нуждается в цикле событий. Цикл событий необходим в thread2 (lanched должностным лицом ()) для получения сигнала.

MySlot назовут в thread2.

46
ответ дан Aiua 24 November 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: