QTJambi - 线程中的 QNetworkManager 不发出信号

发布于 2024-08-28 20:10:36 字数 1482 浏览 5 评论 0原文

我是 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();
 } 
}

I am new to QT(jambi). I have a very simple QTJambi (4.5.2) app. I am trying to figure out why this will not work (DoResponseReady never called) within a thread. Switch the static variable between threaded=true/false to reproduce.


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();
 } 
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

骄傲 2024-09-04 20:10:36

您的线程没有 QT 事件循环,因此不会发生任何事情。

我没有在Java中使用过QT,而是在C++中使用过,所以我不能给你示例代码,但这个页面应该有帮助:

http://qt.nokia.com/doc/qtjambi-4.5.2_01/com/trolltech/qt/qtjambi-threads.html< /a>

话虽这么说...尝试这个:

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() 方法中需要处理的所有初始事务,例如计时器或网络请求。

Your thread doesn't have a QT event loop so nothing is going to happen.

I've not worked with QT in Java but rather c++ so I can't give you example code, but this page should help:

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

With that being said ... try this:

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

Note that this should just point you in the right direction, you'll need to deal with synchronization issues, etc. Also note the paragraph that talks about QObject ownership and threads (thread affinity).

In C++ I created a class that extends QThread and an abstract interface called "Worker". The QThread derived class takes the Worker object as an argument in the constructor and changes the affinity so that it's "owned" by that thread (see: moveToThread() ). Then in the overridden run() method, it calls the Worker::init() method after which it starts the event loop. I fire off whatever initial things need to be handled in the init() method, such as timers or network requests.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文