Emit is not working when calling on a separate android thread



  • Hey. Sorry for my english.

    There is a code that running on android on a separate Thread (Java Code) like this:

    @
    public class ClientThread extends Thread
    {
    public void run()
    {
    MainActivity.nativeMethod(); // not working
    }
    }

    public class MainActivity extends QtActivity
    {
    private static final String TAG = "MainActivity";
    private static MainActivity _instance = null;
    private static ClientThread _clientThread = null;

    public MainActivity()
    {
        _instance = this;
    }
    
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        nativeMethod(); // working
    
        _clientThread = new ClientThread();
        _clientThread.start();
    
    }
    
    public static native void nativeMethod();
    

    }@

    And there is C++ bridge for that:

    @class TestObject : public QObject
    {
    Q_OBJECT

    public:
    explicit TestObject(QObject *parent = 0);
    static TestObject *getInstance();

    Q_SIGNALS:
    void nativeMethod();

    public Q_SLOTS:

    };

    static void jniNativeMethod(JNIEnv *, jclass)
    {
    qDebug() << "works threaded or non-threaded calls"
    emit TestObject::getInstance()->nativeMethod();
    }@

    Also a QML connection:

    @import TestObjectPackage 1.0

    Connections
    {
    target: TestObjectPackage.testObjectInstance
    onNativeMethod:
    {
    console.log("QML received signal!");
    }
    }@

    jniNativeMethod calls every time but emit not sending signal to QML on sepearate thread. Could you help me?



  • I wonder if the problem is due to the use of a static signal.

    Cross-thread signal delivery uses an event loop in the receiving thread. Intra-thread delivery is a direct call by default. The static use might confuse the detection of the correct connection type.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.