Qt - kilka emit'ów w jednym slocie

0

Witam,
Nie rozumiem pewnego zjawiska. Muszę wykorzystać w aplikacji komunikację modbus oraz porównywanie wartości zmiennych. W momencie spełnienia warunków "dzieją się" odpowiednie zdarzenia. Przebrnąłem już przez wątki i utworzyłem wątek do komunikacji modbus. I teraz testuję szkic głównej funkcji. Mój problem polega na tym ,że chcę z jednej funkcji wysłać przynajmniej dwa emit'y, które spowodowałyby reackję w wątku komunikacji modbus.Dodatkowo funkcja główna jest wywoływana cyklicznie przez timer (chodzi o szybkie odświeżanie wartości z modbus'a)
Teraz kod:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "settings.h"
#include <QStatusBar>
#include <QDebug>
#include<QString>
#include <QSqlQueryModel>
#include <QFile>
#include <QThread>
#include "modbus.h"
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),
    ui(new Ui::MainWindow)

{
 
    ui->setupUi(this);
    timer_1=new QTimer(this);
    timer_1->setInterval(2000);
// Zarządzanie wątkami
    QThread* thread = new QThread;
    modbus* Modbus = new modbus;
    Modbus->moveToThread(thread);

    connect(this, SIGNAL (cyl_1_FF()), Modbus, SLOT (Cylinder_1_FF()));
    connect(this, SIGNAL(Read_1()),Modbus, SLOT(Read_1_value()));
     thread->start();
      connect(timer_1,SIGNAL(timeout()),this,SLOT(Test_mode_1()));

}
void MainWindow::Test_mode_1(){
//Tryb badania
emit Read_1();
emit cyl_1_FF();
}

Problem jest taki, że jak zostawię tylko jeden emit to ten emit działa. Przy dwóch emitach - żaden nie działa.
Próbowałem również rodzaju połączenia Qt::BlockingQueuedConnection ale to również nie działa.

0

Ale co znaczy "emit nie działa"? Za mało kodu pokazałeś, żeby można było coś stwierdzić.
Ja bym:
po 1. sprawdził czy uruchomienie timera gdzieś mi nie zginęło
po 2. sprawdził czy nie lecą jakieś warningi z connectów i w ogóle czy się powiodły
po 3. zmienił connecty Qt4 na Qt5, dla pewności i żeby zacząć się do nich przyzwyczajać
po 4. sprawdził deklaracje sygnałów i slotów w pliku nagłówkowym
po 5. przebudował projekt od zera, tzn wywalił katalog budowania i zbudował od nowa (tak, chodzi o pliki moc)

0

po 1. sprawdził czy uruchomienie timera gdzieś mi nie zginęło - Nie zginęło. Timer cyklicznie wysyła emit
po 2. sprawdził czy nie lecą jakieś warningi z connectów i w ogóle czy się powiodły - Tak powiodły się
po 3. zmienił connecty Qt4 na Qt5, dla pewności i żeby zacząć się do nich przyzwyczajać - OK - popracuję nad tym
po 4. sprawdził deklaracje sygnałów i slotów w pliku nagłówkowym -
po 5. przebudował projekt od zera, tzn wywalił katalog budowania i zbudował od nowa (tak, chodzi o pliki moc) - nic nie da

Doszedłem do tego, że emity są wysyłane ale prawie w tym samym czasie. Skutkuje to prawie jednoczesnym wysyłaniem danych na port QSerialPort. W efekcie gdy dwie komednty usiłują się "wepchać" do portu to żaden nie wejdzie. Wyczytałem gdzieś, że przesunięcie komunikacji do wątku spowoduje, że wątek będzie używał czegoś w rodzaju stosu i kolejkował komendy. Ale tak się chyba nie dzieje. Teraz próbuję stworzyć procedurę zarządzającą komunikacją QSerialPort. Wiem, że są kontrolki modbusowe ale urządzenie, z którym się komunikuje używa protokołu modbus ale ma "swoje" adresy rejestrów dlatego zrobiłem tek kilka komend "na piechotę"

0

Wyczytałem gdzieś, że przesunięcie komunikacji do wątku spowoduje, że wątek będzie używał czegoś w rodzaju stosu i kolejkował komendy. Ale tak się chyba nie dzieje.

chodzi zapewne o coś w rodzaju QueuedConnection
https://woboq.com/blog/how-qt-signals-slots-work-part3-queuedconnection.html

Wyjścia masz trzy.

  • Poczytać link który podałem i podobne być może coś ci przyjdzie do głowy
  • Samemu kolejkować po stornie qserialport sygnały
  • Przejść na inny rodzaj komunikacji między wątkami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1