我是QT(jambi)的新手。我有一个非常简单的QTJambi(4.5.2)应用程序。我试图弄清楚为什么这在一个线程中不起作用(DoResponseReady永远不会调用)。在threaded = true / false之间切换静态变量以重现。
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();
}
}
答案 0 :(得分: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()方法中需要处理的任何初始事物,例如定时器或网络请求。