Thread overview
C++ - Unknown method parameter type Hatası
Aug 04, 2016
İbrahim
Aug 04, 2016
İbrahim
Aug 04, 2016
kerdemdemir
Aug 04, 2016
İbrahim
Aug 05, 2016
İbrahim
August 04, 2016

Selamün Aleyküm;
Şöyle bir kod yazdım:

// testclass.h
class TestClass : public QObject
{
 Q_OBJECT
public:
 Q_INVOKABLE enum Duration {
   SHORT = 0,
   LONG = 1
 };

 explicit TestClass(QObject *parent = 0);
 Q_INVOKABLE QString message(const QString& msg);
 Q_INVOKABLE void toast_message(const QString& text, Duration duration);

signals:

public slots:
};
..
// testclass.cpp
..
void TestClass::toast_message(const QString& text, Duration duration = SHORT)
{
 QAndroidJniObject _text = QAndroidJniObject::fromString(text);
 QAndroidJniObject toast = QAndroidJniObject::callStaticObjectMethod("android/widget/Toast", "makeText",
                                     "(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;",
                                     QtAndroid::androidActivity().object(), _text.object(), jint(duration));
 toast.callMethod<void>("show");
}
..

Bu sınıf ve üye fonksiyon QML içerisinde kullanılacak ve uygulamayı çalıştırdığımda uygulama çalışıyor lakin toast_message üye fonksiyonu devreye sokulduğunda şu uyarıyı veriyor: 'W/libQt_App.so(11956): qrc:/Page1.qml:17 ((null)): qrc:/Page1.qml:17: Error: Unknown method parameter type: Duration'
Yani neden Duration numaralandırma tipli parametreyi bilinmeyen parametre olarak algılıyor? Nasıl çözüme ulaşabilirim? Teşekkürler!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 04, 2016

Aslında bu sorunu çözdüm: Q_ENUM(Duration) demem gerekiyormuş. Fakat daha sonra uygulamayı Android'de çalıştırınca "çalışmayı durdurdu" hatası aldım ve log ekranında şu hatayı gördüm: 'F/libc (14649): Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 14849 (project.example)'. Aslında hata toast_message içindeki işlemlerin thread içinde yapılması gerektiğini anlıyorum (bkz: https://www.kdab.com/qt-android-use-android-toast/). Lakin 'runOnAndroidThread' gibi UI thread'ine niçin ihtiyacımız olduğunu anlamıyorum. Yazılımcı burada thread kullanması gerektiğini nasıl anlıyor? Yoksa Qt penceresi içinde saf native Android Java kodu çalıştırdığımız için aynı anda 2 faklı iş mi yapılmış oluyor da thread gerekiyor?

Konu dışı: Ali Hocam siz paranızı C++'dan mı yoksa D'den mi kazanıyorsunuz? :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 04, 2016

İbrahim Selam,

Q_INVOKABLE fonksiyonlar için kullanılır. Biraz ismide anımsatıyor zaten. Bu qInvokable'la şöyle şeyler yapılabilir.

class A : public QObject
{
 //QObject macrosu filan fişman

 Q_INVOKABLE void foo();
}
  A a;
  QMetaObject::invokeMethod(&a, "foo",  Qt::AutoConnection); //--> foo diye bir string kullanarak method çağırdım

Bu özellik büyük programlarda "reflection"(yanlış kullanıyor olabilirim) yapabilmemizi sağlar. Yani "foo" string'ini programın dışından bir XML 'den filan okuduğumuzu düşün bu durumda programa bir dinamiklik kazandırıyoruz. Dosyadan okuduğumuz isme göre değişik methodlar çağırabiliyoruz.

Methodlar için kullanılması gereken Q_INVOKABLE 'in bir enum için kullanılması biraz ilginç geldi bana.
Acaba başka bir yerde varmıdır böyle kullanım emin olmadığımdan sorayım dedim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 04, 2016

Bunlar çok özelleşmiş konular. :) Bende hâlâ biraz C++ kaldı ama Qt'den hiç anlamıyorum. Dışarıdan bir gözlemci olarak tek söyleyebileceğim şey, genel bir kural olarak, '= SHORT' gibi varsayılan değerler bildirime yazılmalıdır, tanıma değil. Belki o yüzdendir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 04, 2016

Ben iki aydan beri yalnızca D (ve tabii biraz Python) kullanan Weka.io'da çalışıyorum. Daha önce çalıştığım Riverbed'de ise C++11 ve sonrasına tam anlamıyla geçmemiş olduğumuzdan, her ne kadar modern olanaklarını biliyor olsam da kendimi artık C++'ta deneyimli görmüyorum.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 05, 2016

@kerdemdemir merhaba;
Aslında Q_INVOKABLE yalnızca fonksiyonlar için geçerli dediğiniz gibi. Bu koddaki enuma bu makroyu ben verdim çünkü tek enuma hata verince ben de bu şekilde denedim ama böyle de çalışmadı. Zaten dediğiniz gibi yanlış bir kullanım bu şekilde. Doğrusu: http://doc.qt.io/qt-5/qobject.html#Q_INVOKABLE

Siz Qt biliyorsanız 'F/libc (14649): Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 14849 (project.example)' bu hatada ui thread kullanmamız gerek lakin niçin thread kullanıyoruz? Çünkü burada sadece toast mesajı gösteriyoruz, normal javada toast mesajı için kullanmiyoruz da neden Qt - C++ içinde javadan toast mesajı çalıştırırken ui thread kullanmamız gerek? Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 05, 2016
void TestClass::toast_message(const QString& text, Duration duration) {
 std::thread run([&]
 {
   QAndroidJniObject _text = QAndroidJniObject::fromString(text);
   QAndroidJniObject toast = QAndroidJniObject::callStaticObjectMethod(
            "android/widget/Toast", "makeText",
            "(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;",
            QtAndroid::androidActivity().object(), _text.object(), jint(duration));
    toast.callMethod<void>("show");
    });
   run.join();
}

Bu arada şöyle bir değişiklik yaptım kodda ama bu kod ile yine aynı thread hatasını aliyorum. KDAB sitesinde Java thread'i kullanmış (https://www.kdab.com/qt-android-run-c-code-android-ui-thread/) ama ben herşeyi java'ya bırakmamak için C++ tarafında std::thread, QThread, std::async vb. özelliklerle yapmaya çalıştım kodda da görüldüğü gibi lakin yine ayni hatayi aliyorum. Bunu nasil yapabilirim ve sorun neyden kaynaklı bu halde? Çünkü std::thread koydum üye fonksiyona ama nafile.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]