RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-212367

Kto To's questions

Martin Hope
Kto To
Asked: 2022-04-27 07:18:45 +0000 UTC

在游戏 15 中检查解决方案

  • 3

帮我想一个公式/算法来检查解决方案的存在игре в 15,但以一般的方式。也就是说,我将有一个大小为 3x3、5x5 等的字段的公式。以下是Wikipedia为 4x4 写的内容:

让带有数字的正方形位于数字小于的正方形i之前(如果您从左到右和从上到下计数)。我们将考虑,即如果在第 - 个数字的关节之后没有小于 的数字,则。我们还引入了一个数字——空单元格的行号(从 1 开始计数)。如果总和 是奇数,那么这个谜题就没有解决方案。kin[i] = kiik=0e公式

对于 4x4,对于游戏的可解性,总和必须是偶数,然后(以下我的猜测)对于字段 3x3、5x5 等,对于可解性,总和必须是奇数。好吧,在我的决定中0-我认为是一个空牢房。

// Проверяет игру на наличие решения.
function checkArrayForGame(arrayOrig) {
    let size = Math.sqrt(arrayOrig.length);
    let indZero = arrayOrig.indexOf(0);
    if (size !== parseInt(size) || indZero === -1) {
        console.log('Не верный формат аргументов');
        return false;
    }
    let N = parseInt(indZero / size) + 1; // на какой строке пустая клетка начиная с 1

    let array = arrayOrig.slice(); // make copy array;

    array.splice(indZero, 1); // удалил нолик из массива.
    for(let i = 0; i < array.length - 1; ++i) {
        for (let j = i + 1; j < array.length; ++j) {
            N += array[i] > array[j];
        }
    }
    // console.log(size, N)
    return ((size % 2) && (N % 2))
            || (!(size % 2) && !(N % 2));
}

let testDataTrue = [
        [1, 2, 3, 4, 5, 6, 7, 8, 0],
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0]
    ];
let testDataFalse = [
        [1, 2, 3, 4, 5, 6, 8, 7, 0],
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 14, 0],
        [1, 7, 4, 6, 3, 0, 8, 2, 5] // для этого примера не работает =(
    ];
console.log('Must be True');
for (let i = 0; i < testDataTrue.length; ++i) {
    console.log('*', checkArrayForGame(testDataTrue[i]));
}
console.log('Must be False');
for (let i = 0; i < testDataFalse.length; ++i) {
    console.log('*', checkArrayForGame(testDataFalse[i]));
}

感谢@Harry 的回答。我试图根据你的公式来实现哈利公式:。结果是这段代码:

// Проверяет игру на наличие решения.
function checkArrayForGame(arrayOrig) {
    let size = Math.sqrt(arrayOrig.length);
    let indZero = arrayOrig.indexOf(0);
    if (size !== parseInt(size) || indZero === -1) {
        console.log('Не верный формат аргументов');
        return false;
    }
    let e = parseInt(indZero / size); // на какой строке пустая клетка начиная с 0

    let rightPart = (size - 1) * (e - 1) + 1;

    let array = arrayOrig.slice(); // make copy array;
    array.splice(indZero, 1); // удалил нолик из массива.

    let summ = 0;

    for (let i = 0; i < array.length - 1; ++i) {
        for (let j = i; j < array.length; ++j) {
            summ += array[i] > array[j];
        }
    }
    let result = summ + rightPart;
    // console.log(size, e, rightPart, summ, result);
    //return ((size % 2) && (result % 2))
    //        || (!(size % 2) && !(result % 2));
    return result % 2;
}
let testDataTrue = [
        [1, 2, 3, 4, 5, 6, 7, 8, 0],
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0]
    ];
let testDataFalse = [
        [1, 2, 3, 4, 5, 6, 8, 7, 0],
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 14, 0],
        [1, 7, 4, 6, 3, 0, 8, 2, 5] // для этого примера не работает =(
    ];
console.log('Must be True');
for (let i = 0; i < testDataTrue.length; ++i) {
    console.log('*', checkArrayForGame(testDataTrue[i]));
}
console.log('Must be False');
for (let i = 0; i < testDataFalse.length; ++i) {
    console.log('*', checkArrayForGame(testDataFalse[i]));
}

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2022-04-07 22:46:30 +0000 UTC

长功能上的多线程进度条

  • 1

如何在不创建单独的子类QObject的情况下在单独的线程中调用具有更新进度条能力的函数?

有一个很长的函数可以传递回调函数和数据:

typedef bool (loadProgressFunc) (int percent, void* userHandle);

bool veryLongFunc(int inputData, loadProgressFunc progress, void* userHandle);

如何在单独的线程中调用这个函数,但是让窗口中的进度条被更新?

static bool process(int percent, void* userHandle) {
    qDebug() << __PRETTY_FUNCTION__ << percent;
    MainWindow* _this = static_cast<MainWindow*>(userHandle);
    _this->testFunc(percent);
    return true;
}

void MainWindow::testFunc(int percent) {
    ui->progressBar->setValue(percent);
}

void MainWindow::startLongFunc() {
    veryLongFunc(1, process, this);
}
qt
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-06-06 17:44:29 +0000 UTC

如何进行布局?

  • 0

如何修复缩进并使代码更简单:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Layouts 1.12

Window {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    RowLayout {
        id: _rootLayout
        anchors.fill: parent
        anchors.margins: 10
        spacing: 10

        ColumnLayout {
            id: _1_2_6
            Layout.fillHeight: true
            Layout.preferredWidth: (_rootLayout.width - _rootLayout.spacing) * 0.66
            RowLayout {
                id: _1_2
                Layout.fillWidth: true
                Rectangle {
                    id: _1
                    Layout.fillHeight: true
                    Layout.preferredWidth: (_1_2_6.width - _1_2_6.spacing) * 0.33
                    color: "green"
                    Text {
                        text: "1"
                    }
                }
                Rectangle {
                    id: _2
                    Layout.fillHeight: true
                    Layout.preferredWidth: _1_2_6.width - _1_2_6.spacing - _1.width
                    color: "lightgreen"
                    Text {
                        text: "2"
                    }
                }
            }
            Rectangle {
                id: _6
                Layout.fillWidth: true
                Layout.preferredHeight: (_1_2_6.height - _1_2_6.spacing) * 0.33
                color: "grey"
                Text {
                    text: "6"
                }
            }
        }
        ColumnLayout {
            id: _3_4_5
            Layout.fillHeight: true
            Layout.preferredWidth: (_rootLayout.width - _rootLayout.spacing) - _1_2_6.width
            Rectangle {
                id: _3
                Layout.fillWidth: true
                Layout.fillHeight: true
                color: "lightgray"
                Text {
                    text: "3"
                }
            }
            Rectangle {
                id: _4
                Layout.fillWidth: true
                Layout.fillHeight: true
                color: "orange"
                Text {
                    text: "4"
                }
            }
            Rectangle {
                id: _5
                Layout.fillWidth: true
                Layout.fillHeight: true
                color: "skyblue"
                Text {
                    text: "5"
                }
            }
        }
    }
}

示例1 示例2

如您所见,左列和右列之间的填充比其他地方多。此外,4-5 之间的差距并不总是与差距 2-6(屏幕 2)在高度上匹配。

我也不喜欢这样,如果你_1_2_6有更多的列,你需要减去更多的间距(像这样:)Layout.preferredWidth: (_rootLayout.width - 2 * _rootLayout.spacing) * 0.66。是否可以像 QWidget layout Stretch 那样设置拉伸因子?

最后,Qt Quick Layouts: Polish loop detected. Aborting after two iterations当我水平缩小时,日志中会显示一条“ ”消息。为什么?

qt
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-04-30 21:36:59 +0000 UTC

如何使函数的一部分成为单独的线程?

  • 0

也许我正在重新发明轮子,我想知道一切是否正确(也许在我的实现中没有考虑到所有事情),或者它可以更好、更简单吗?

有一个函数MainWindow::someSlot,其中某个部分 ( MainWindow::veryLongFunc) 必须在单独的线程中完成,以便接口不会挂起。

#mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT    
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    int otherFields() const;
    void setOtherFields(int otherFields);

public slots:
    void someSlot();
private:
    void veryLongFunc();
    Ui::MainWindow *ui;
    int _otherFields;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtConcurrent>
#include <future>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
}

void MainWindow::someSlot() {
    /* some code */
    QFuture<void> t = QtConcurrent::run([this] { veryLongFunc(); });
    while(!t.isFinished()) {
        QApplication::processEvents();
    }
    /* some code */
}

void MainWindow::veryLongFunc() {
    /* very long func */
}

int MainWindow::otherFields() const
{
    return _otherFields;
}

void MainWindow::setOtherFields(int otherFields)
{
    _otherFields = otherFields;
}

MainWindow::~MainWindow() { delete ui; }
c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-04-24 18:57:58 +0000 UTC

为什么使用 QString arg 时程序可能会崩溃?

  • 0

随着程序的长期使用,有时程序会在函数中崩溃QString::arg。有什么问题?


一些代码

QFile *file = new QFile("log.txt");
QTextStream out;
out.setDevice(file);
//**********

在发生错误的函数中,也将上述内容写入文件。一切都被正确记录。此外,它是一个日志功能。她经常被叫。但有时它会崩溃。


有时会显示一条消息Critical error detected c0000374

错误截图

c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-02-17 16:40:44 +0000 UTC

一个简单的多线程示例

  • 1

帮助实现示例程序。我做得对还是有更简单的方法?好吧,我的程序挂在了线上auto r = f.get(); ,当其中一个线程找到密钥时,如何让线程完成它们的工作?这是一个示例任务。它能在我的电脑上运行 3 年这一事实并不重要。

#include <iostream>
#include <future>
#include <vector>

#define KEY_PASS  (0xFFAAFFAABBCCDDEE)

bool checkPass(uint64_t pass) {
    return pass == KEY_PASS;
}

const uint64_t STEP = 0x1000000000000000;

uint64_t funcAsync(uint64_t begin) {
    for (uint64_t i = 0; i < STEP; ++i) {
        if (checkPass(begin + i)) {
            return i;
        }
    }
    return uint64_t(-1);
}


int main() {
// Пример без работы с потоками
//    for (uint64_t i = 0; i < UINT64_MAX; ++i) {
//        if (checkPass(i)) {
//            std::cout << std::hex << i << std::endl;
//            break;
//        }
//    }
// Пример с потоками
    uint64_t i = 0;
    std::vector<std::future<uint64_t>> v;
    do {
        v.push_back(std::async(std::launch::async, funcAsync, i));
        i += STEP;
        std::cout << (i >> 60) << " open threads" << std::endl;
    } while (i != 0);
    for (auto& f: v) {
        auto r = f.get();
        if (r != uint64_t(-1)) {
            std::cout << std::hex << r << std::endl;
            break;
        }
    }
}
c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-12-13 16:24:59 +0000 UTC

保位排序

  • 1

是否有一个标准函数允许您在保留索引的同时对数组(向量或列表)进行排序,或者如何将这种排序为“两行”?

std::list<int> src {1, 8, 3, 6, 5};
std::list<uint> res = magicFunc(&src);
// src == [ 1, 3, 5, 6, 8]
// res == [ 0, 2, 4, 3, 1]
c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-10-28 21:55:06 +0000 UTC

QProgressBar / styleSheet 改变颜色

  • 4

我想做一个红色的进度条,以防失败。怎么做?我在下面的例子中发现了最美丽的东西。这里几何变化,帧的大小,进度条叠加在百分比上,百分比变为100。

我想如果他们给我写了 QT 风格是如何写的,我只能把颜色改成红色,其余的都适合我。

if (!m_executor->is_ok()) {
    ui->progressBar->setFormat("error");
    ui->progressBar->setStyleSheet("QProgressBar{"
                                   "border: 1px solid transparent;text-align: right;"
                                   "color:rgba(255,255,250,255);"
                                   "border-radius: 5px;"
                                   "border-width: 3px;"
                                   "border-image: 9,2,5,2; "
                                   "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(200, 200, 200, 200), stop:1 rgba(0, 0, 0, 200));"
                                    "}"
                                   "QProgressBar::chunk {background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(255,200,0,255), stop: 1 rgba(255,0,0,255));}");
}

例子 默认

c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-10-23 00:42:13 +0000 UTC

QMake、SVN 获取修订行

  • 1

我有两种方法可以获取 SVN 版本:

DEFINES += SVN_REVISION1=\\\"$$system(svnversion -n)\\\"
DEFINES += SVN_REVISION2=$$system(svnversion -n $$PWD)

两种方式都有效。第一个以字符串形式给出版本。在使用定义进行操作后的第二个:

#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define SVN_REVISION_STR VALUE(SVN_REVISION)

也变成了字符串。如果将项目复制到没有 SVN 的文件夹,这两种方法都会失败。运行程序svnversion -n会产生 2 个单词:Unversioned directory. 如何不以至少一种方式否认?如何检查它是否在存储库中?


我简化了这个例子:

AA = \\\"Unversioned directory\\\"
BB = \\\"212M\\\"
message($$AA)
message($$BB)

结论:

Project MESSAGE: \"Unversioned directory\"
Project MESSAGE: \"212M\"

我怎样才能在这里去掉一个空格,或者检测一个空格,或者只留下第一个单词?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-10-22 21:27:00 +0000 UTC

在 QT 程序中打印 svn 修订版

  • 0

有一个 svn 存储库。我不时抛出一个项目并对其发表评论。有什么办法可以获取提交号并将其显示在程序中?

例如,该文件versionsvn.h是这样的:

#ifndef __VERSIONSVN_H_
#define __VERSIONSVN_H_

#define SVN_REVISION (/*тут не знаю что!!!*/)

#endif // __VERSIONSVN_H_

UDP:@Chorkov 的版本有效。

UDP:没有额外的宏,你可以这样做:

DEFINES += SVN_REVISION=\\\"$$system(svnversion -n)\\\"
windows
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-09-19 22:51:34 +0000 UTC

解析定义记录器

  • 0

帮助理解define'ah。

#define QUOTE_(WHAT) #WHAT
#define QUOTE(WHAT) QUOTE_(WHAT)
#define dbg(format, ...) printf("%s: "format, __FILE__":"QUOTE(__LINE__), ## __VA_ARGS__)
  • #一格和二格有什么区别##?
  • 如何QUOTE/工作QOUTE_。为什么一个定义还不够?
c
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-09-12 21:58:55 +0000 UTC

在模板类中初始化常量

  • 0
enum class E { e0, e1, e2, };

template <int S>
class C {
    static const E _e = (S == 1 ? E::e0 : S == 123 ? E::e1 : E::e2);
};

如果我的枚举有很多值,可以通过 switch/case 或其他方式设置 _e 字段吗?

c++
  • 3 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-08-29 01:55:50 +0000 UTC

在具有可变数量参数的函数中传递参数

  • 0
#include <stdarg.h>

void myPrintF(const char *__format, ...)
{
    va_list arg;
    va_start (arg, __format);
    printf(__format, arg);
    va_end (arg);
}


int main(void)
{
    time_t t = time(NULL);
    struct tm* aTm = localtime(&t);
    myPrintF("Close log %04d/%02d/%02d %02d:%02d:%02d\n",aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
    printf("Close log %04d/%02d/%02d %02d:%02d:%02d\n",aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
    return 0;
}

为什么会输出?怎么修?

Close log 6422164/-10800/1567025724 6422152:1980360769:1904456
Close log 2019/08/28 20:55:24
c
  • 2 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-08-22 23:00:32 +0000 UTC

带常量的 typedef

  • 1

为什么const pA这A *const是我希望看到的const A*?

typedef struct {
    uint32_t i[4];
} A, *pA;

class B {
public:
    uint64_t i[2];
};

void f(pA aa) {
    std::cout << std::hex << aa->i[0] << " "
                          << aa->i[1] << " "
                          << aa->i[2] << " "
                          << aa->i[3] << std::endl;
}
void ff(const std::vector<B> &v) {
    f(const_cast<pA>(reinterpret_cast<const A *>(v.data())));
//    f(const_cast<pA>(reinterpret_cast<const pA>(v.data())));
}

int main() {
    std::vector<B> vB;
    vB.push_back({1, 1});
    ff(vB);
    return 0;
}
c
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-08-15 00:18:51 +0000 UTC

函数式类型转换

  • 1

我没有在任何地方找到函数调用风格的类型转换的信息:

int i;
uint ui = uint(i);

我最喜欢用 QT 写东西。我不知道这种行为有多标准,也不知道写而不是经典的*_casst<T>(value).

c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-08-12 21:36:53 +0000 UTC

lambda函数中变量的生命周期?

  • 0

按值传递到 lambda 函数的捕获区域(在方括号中)的变量的生命周期。

想不出好例子。虚构代码:

QVector<SomeClass*> objs = initObjs();
for (int i = 0; i < objs.size(); ++i) {
    // SomeClass::signal(QString)
    connect(objs[i], &SomeClass::signal, this, [this, i] (QString msg) { qDebug() << i << msg; });
}

在这部分代码中,我想显示来自对象数组的消息,并带有对象索引。这应该工作吗?我希望看到的示例输出:

0 我是索引为 0 的 obj

来自 obj[6] 的 6 信号

2somemsg

c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-08-07 19:43:42 +0000 UTC

如何定义内联函数?

  • 4

如何判断一个函数是嵌入的还是有自己的地址和实现,比如非嵌入函数?编译器可以忽略该指令,尤其是当我询问函数的地址时。以及如何判断不清楚,只看汇编代码?

#include <iostream>

void func () {
    std::cout << "func";
}

inline void func2() { func(); }


int main()
{
    std::cout << uint64_t(&func) << " || " << uint64_t(&func2) << std::endl;
    // Пример вывода: 4199872 || 4204384
    return 0;
}
c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-08-07 14:24:52 +0000 UTC

使用 goto 是否合理?

  • 2

我在我的项目中看到了以下代码:

#define chk(_f)        if ((status = _f) != 0) goto Error;

int init() {
    int status = 0;
    someStruct *s = NULL;
    chk(someFunc1());
    if (s = (someStruct)calloc(1, sizeof (*s)) == NULL) {
        chk(1);
    }
    chk(someFunc2());
    return 0;
Error :
    if (s)
        free(s);
    return status;
}

一般来说goto,今天使用这样的设计是否可取?

c
  • 4 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-07-18 20:49:26 +0000 UTC

智能指针信号槽

  • 0

我试图std::unique_ptr通过信号/插槽传递智能指针,但由于已删除的复制构造函数 ( unique_ptr(const unique_ptr&) = delete;) 而出现错误。那么是否可以std::unique_ptr在信号/表中使用智能指针?UDP:不! 相关问题:如何在线程之间传递大型容器?

重新制作了指针下的类std::shared_ptr<Data>。使用@yrHeTaTeJlb备注,我调用:Q_DECLARE_METATYPE(std::shared_ptr<Data>);和qRegisterMetaType<std::shared_ptr<Data>>("shared_ptr<Data>");。一切正常。

qDebug() 的输出:

Data();
finish
~Data();

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMap>
#include <memory>

class Data {
    QMap<int, QString> _m;  // большие
    std::array<QString, 1024*1024> _a;
public:
    Data() { qDebug() << "Data();"; }
    ~Data() { qDebug() << "~Data();"; }
    void initData();
};
Q_DECLARE_METATYPE(std::shared_ptr<Data>);

class Worker : public QObject {
    Q_OBJECT
    std::shared_ptr<Data> _d;
public:
    Worker() : QObject(), _d(std::make_shared<Data>()) { }
signals:
    void finished(std::shared_ptr<Data> d);
public slots:
    void process() { _d->initData(); emit finished(_d); }
};

class Controller : public QObject {
    Q_OBJECT
    std::shared_ptr<Data> _d;
public:
    Controller(QObject *parent = nullptr) : QObject(parent) { }
    void start();
signals:
    void finished(std::shared_ptr<Data> d);
};

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
    Controller _c;
    std::shared_ptr<Data> _d;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QStandardItemModel>
#include <QThread>

void Data::initData() { /*some init code*/ }

void Controller::start() {
    QThread *thr = new QThread;
    Worker *w = new Worker;
    w->moveToThread(thr);
    connect(thr, &QThread::started, w, &Worker::process);
    connect(w, &Worker::finished, this, &Controller::finished);
    connect(w, &Worker::finished, thr, &QThread::quit);
    connect(w, &Worker::finished, w, &Worker::deleteLater);
    connect(thr, &QThread::finished, thr, &QThread::deleteLater);
    thr->start();
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
    qRegisterMetaType<std::shared_ptr<Data>>("shared_ptr<Data>");
    ui->setupUi(this);
    connect(&_c, &Controller::finished, this, [this] (std::shared_ptr<Data> d) { qDebug() << "finish"; _d = d; });
    _c.start();
}

MainWindow::~MainWindow() { delete ui; }
c++
  • 1 个回答
  • 10 Views
Martin Hope
Kto To
Asked: 2020-07-18 17:41:00 +0000 UTC

如何在线程之间传递大型容器?

  • 0

如何在线程之间传递大型容器?你能传递一个指针吗?陷阱,提示?我在下面举一个例子。

class Data {
    QMap<int, SomeClass> _m;  // большие
    std::array<SomeClass, 1024*1024> _a;
public:
    void initData();
};

class Worker : public QObject {
    Q_OBJECT
    Data *_d;
public:
    Worker() : QObject() { _d = new Data; }
signals:
    void finished(Data *d);
public slots:
    void process() { _d->initData(); emit finished(_d); }
};

class Controller : public QObject {
    Q_OBJECT
    Data *_d;
public:
    Controller(QObject *parent = nullptr) : QObject(parent) { }
    void start() {
        QThread *thr = new QThread;
        Worker *w = new Worker;
        w->moveToThread(thr);
        connect(thr, &QThread::started, w, &Worker::process);
        connect(w, &Worker::finished, this, [this] (Data *d) { _d = d;});
        connect(w, &Worker::finished, this, &Controller::finished);
        connect(w, &Worker::finished, thr, &QThread::quit);
        connect(w, &Worker::finished, w, &Worker::deleteLater);
        connect(thr, &QThread::finished, thr, &QThread::deleteLater);
        thr->start();
    }
signals:
    void finished(Data *d);
};

UDP:使用智能指针时出现问题:信号到插槽智能指针

c++
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5