2010-04-14 88 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