Qtjambi - QNetworkManager do thread não emite sinais
-
26-09-2019 - |
Pergunta
Eu sou novo no QT (Jambi). Eu tenho um aplicativo Qtjambi (4.5.2) muito simples. Estou tentando descobrir por que isso não funcionará (o Doresponseady nunca ligou) dentro de um tópico. Alterne a variável estática entre rosqueado = true/false para reproduzir.
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();
}
}
Solução
Seu tópico não tem um loop de evento QT, então nada vai acontecer.
Não trabalhei com o QT em Java, mas sim C ++, então não posso lhe dar um código de exemplo, mas esta página deve ajudar:
http://qt.nokia.com/doc/qtjambi-4.5.2_01/com/trolltech/qt/qtjambiadreads.html
Com isso dito ... tente o seguinte:
void testnetwork_thread()
{
new Thread(new Runnable() {
@Override
public void run() {
QEventLoop loop = new QEventLoop();
testnetwork();
loop.exec();
}
}).start();
}
Observe que isso deve apontar na direção certa, você precisará lidar com problemas de sincronização, etc. Observe também o parágrafo que fala sobre a propriedade e os threads do QOBject (afinidade do thread).
Em C ++, criei uma classe que estende o QTHREAD e uma interface abstrata chamada "Worker". A classe derivada do QTHread toma o objeto do trabalhador como um argumento no construtor e altera a afinidade para que seja "de propriedade" por esse thread (veja: MoveTothread ()). Então, no método RUN () substituído, ele chama o método Worker :: init () após o qual ele inicia o loop do evento. Eu disparo o que as coisas iniciais precisam ser tratadas no método init (), como temporizadores ou solicitações de rede.