Pregunta

Soy nuevo en el cuarto de galón (Jambi). Tengo una aplicación muy simple QTJambi (4.5.2). Estoy tratando de averiguar por qué esto no funcionará (DoResponseReady nunca llamó) dentro de un hilo. Cambie la variable estática entre roscada = verdadero / falso de reproducir.


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

Solución

Su hilo no tiene un bucle de eventos QT así que nada va a pasar.

No he trabajado con QT en Java, pero en lugar de C ++, así que no puedo dar código de ejemplo, pero esta página debería ayudar:

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

Con eso se dice ... intente lo siguiente:

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

Tenga en cuenta que esto sólo se debe apuntar en la dirección correcta, usted tendrá que hacer frente a problemas de sincronización, etc. También tenga en cuenta el párrafo que habla sobre la propiedad y los hilos de rosca (afinidad) QObject.

En C ++ que creó una clase que se extiende QThread y una interfaz abstracta llamada "trabajador". El QThread deriva clase toma el objeto trabajador como un argumento en el constructor y cambia la afinidad de modo que es "propiedad" de ese hilo (ver: moveToThread ()). Luego, en el método run () sustituido, se llama al método Trabajador :: init () después de lo cual se inicia el ciclo de eventos. Me llamas más allá cualesquiera cosas iniciales deben ser manejados en el método init (), tales como temporizadores o solicitudes de red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top