相关疑难解决方法(0)

如何在Qt,GCD风格的给定线程中执行仿函数或lambda?

在带有GCD的ObjC中,有一种在旋转事件循环的任何线程中执行lambda的方法.例如:

dispatch_sync(dispatch_get_main_queue(), ^{ /* do sth */ });
Run Code Online (Sandbox Code Playgroud)

要么:

dispatch_async(dispatch_get_main_queue(), ^{ /* do sth */ });
Run Code Online (Sandbox Code Playgroud)

[]{ /* do sth */ }在主线程的队列中执行某些操作(相当于在C++中),阻塞或异步.

我怎么能在Qt中做同样的事情?

从我所读到的,我想解决方案将以某种方式向主线程的某个对象发送信号.但是什么对象呢?只是QApplication::instance()?(那是那时生活在主线程中的唯一对象.)什么信号?


从目前的答案和我目前的研究来看,似乎我需要一些虚拟对象来坐在主线程中,有一些插槽只是等待进入某些代码来执行.

所以,我决定使用子类QApplication来添加它.我目前的代码,但不起作用(但也许你可以帮忙):

#include <QApplication>
#include <QThread>
#include <QMetaMethod>
#include <functional>
#include <assert.h>

class App : public QApplication
{
    Q_OBJECT

public:
    App();

signals:

public slots:
    void genericExec(std::function<void(void)> func) {
        func();
    }

private:
    // cache this
    QMetaMethod genericExec_method;
public:
    void invokeGenericExec(std::function<void(void)> func, Qt::ConnectionType connType) {
        if(!genericExec_method) {
            QByteArray normalizedSignature = QMetaObject::normalizedSignature("genericExec(std::function<void(void)>)");
            int …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading

35
推荐指数
3
解决办法
2万
查看次数

为什么在exec()之前调用quit()不退出应用程序?

为什么这个程序正常运行并显示主窗口?我希望它退出,因为quit()在构造函数中调用.

Main.cpp的:

#include<QApplication>
#include"MainWindow.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
   qApp->quit();
}

void MainWindow::closeEvent(QCloseEvent *)
{
    qDebug("Hello world!");
}
Run Code Online (Sandbox Code Playgroud)

qt

6
推荐指数
2
解决办法
2318
查看次数

QTimer :: singleShot(0,object SLOT(obj_slot()))有什么作用?

我是初学者,学习Qt,并试图了解Qt提供的下载操作示例。在downloadmanager.cpp中,成员函数如下:

void DownloadManager::append(const QUrl &url)
{
    if (downloadQueue.isEmpty())
        QTimer::singleShot(0, this, SLOT(startNextDownload()));

    downloadQueue.enqueue(url);
    ++totalCount;
}
Run Code Online (Sandbox Code Playgroud)
  • 我感到困惑,为什么,如果downloadQueue为空,则需要startNextDownload()在添加URL之前先激活。(注意:startNextDownload()如果downloadQueue为空,则结束程序)
  • 我不确定为什么:QTimer::signleShot(x, y, z)根本没有使用过。据我所知,是一个计时器,它以0毫秒的延迟激活插槽。
  • 我无法通过查看Qt Assistant来确定singleShot是一次性设置以在给定的毫秒间隔内重复激活到插槽还是一次

澄清:

我是新手,例如:

statement1;
statement2;
Run Code Online (Sandbox Code Playgroud)

statement1在继续进行之前,我经常看到运行和完成的情况statement2。但是尝试学习Qt并阅读给定的示例,我看到发生SLOT(startNextDownload())之后被激活downloadQueue.enqueue(url);了。我试图了解为什么这样做。

c++ qt qt4

5
推荐指数
1
解决办法
3307
查看次数

标签 统计

qt ×3

c++ ×2

multithreading ×1

qt4 ×1