2010-04-14 16 views
0

Je suis nouveau à QT (jambi). J'ai une application QTJambi (4.5.2) très simple. J'essaye de comprendre pourquoi ceci ne fonctionnera pas (DoResponseReady jamais appelé) dans un fil. Basculez la variable statique entre threaded = true/false pour reproduire.QTJambi - QNetworkManager du thread n'émet pas de signaux


import com.trolltech.qt.core.QByteArray; 
import com.trolltech.qt.core.QUrl; 
import com.trolltech.qt.gui.QApplication; 
import com.trolltech.qt.gui.QPushButton; 
import com.trolltech.qt.network.QNetworkAccessManager; 
import com.trolltech.qt.network.QNetworkReply; 
import com.trolltech.qt.network.QNetworkRequest; 


public class Main { 
static boolean threaded = false; 
static Main main; 

public static void main(String[] args) { 
    QApplication.initialize(args); 
    main = new Main(); 
    main.doit(); 
} 

void DoResponseReady(QNetworkReply reply) { 
    System.out.println("Response Ready"); 
} 

void testnetwork_thread() 
{ 
    new Thread(new Runnable() { 
    @Override 
    public void run() { 
    testnetwork();  
    } 
    }).start(); 
} 

void testnetwork() 
{ 
    QNetworkAccessManager qnam = new QNetworkAccessManager(); 
    QNetworkRequest req = new QNetworkRequest(new QUrl("http://junkurl.neverwillwork.ok")); 
    QByteArray data = new QByteArray(); 
    qnam.finished.connect(main, "DoResponseReady(QNetworkReply)"); 
    qnam.post(req, data);  
} 

void NetworkTest() 
{ 
    if (threaded) 
    testnetwork_thread(); 
    else 
    testnetwork(); 
} 

public void doit() { 
     QPushButton quit = new QPushButton("Test"); 
     quit.clicked.connect(this, "NetworkTest()"); 
     quit.show(); 
     QApplication.exec(); 
} 
} 

Répondre

1

Votre thread n'a pas de boucle d'événement QT, donc rien ne se passera.

Je n'ai pas travaillé avec QT en Java mais C++, donc je ne peux pas vous donner un exemple de code, mais cette page devrait aider:

http://qt.nokia.com/doc/qtjambi-4.5.2_01/com/trolltech/qt/qtjambi-threads.html

Cela étant dit ... essayer :

void testnetwork_thread() 
{ 
    new Thread(new Runnable() { 
    @Override 
    public void run() { 
    QEventLoop loop = new QEventLoop(); 
    testnetwork();  
    loop.exec(); 
    } 
    }).start(); 
} 

Notez que cela devrait simplement vous orienter dans la bonne direction, vous aurez besoin de traiter les problèmes de synchronisation, etc. Notez également le paragraphe qui parle de la propriété QObject et fils (affinité de fil).

En C++, j'ai créé une classe qui étend QThread et une interface abstraite appelée "Worker". La classe dérivée QThread prend l'objet Worker comme argument dans le constructeur et modifie l'affinité pour qu'elle soit "possédée" par ce thread (voir: moveToThread()). Ensuite, dans la méthode override(), il appelle la méthode Worker :: init() après laquelle il lance la boucle d'événement. Je déclenche toutes les choses initiales qui doivent être traitées dans la méthode init(), comme les minuteurs ou les requêtes réseau.

+0

Merci. Bien que je n'ai pas vérifié que c'est le problème, cela m'aide à me diriger dans une direction. Je serai de retour une fois que j'ai vérifié. – CDSO1