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();
 } 
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top