2010-04-14 90 views
0

我是QT(jambi)的新手。我有一个非常简单的QTJambi(4.5.2)应用程序。我试图弄清楚为什么在一个线程中这不起作用(DoResponseReady从未调用过)。将threading = true/false之间的静态变量切换为重现。QTJambi - QNetworkManager从线程不发射信号


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(); 
} 
} 

回答

1

你的线程没有QT事件循环,所以什么都不会发生。

我没有在Java中使用QT的工作,而是C++,所以我不能给你的示例代码,但是这个页面应该有所帮助:

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

有了这样说......试试这个:

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

注意,这只是你指出正确的方向,你需要处理的同步问题,等等。还要注意的是谈论QObject的所有权和线程(线程关联度)的段落。

在C++中,我创建了一个扩展QThread的类和一个名为“Worker”的抽象接口。 QThread派生类在构造函数中将Worker对象作为参数,并更改亲和性,使其由该线程“拥有”(请参阅​​:moveToThread())。然后在重载的run()方法中,它调用Worker :: init()方法,然后启动事件循环。在init()方法中,我需要处理任何需要处理的东西,比如定时器或网络请求。

+0

谢谢。虽然我还没有意识到这是问题,但它有助于指引我走向一个方向。我确认后我会回来的。 – CDSO1 2010-04-14 20:10:22