小编Sas*_*asa的帖子

将类声明放在.cpp文件中

是否可以在同一.cpp文件中进行类声明和实现?

我想借助mock对象做一些单元测试.以下是我测试的一些示例:

// Some includes removed

#include "abstractconnection.h"

class ConnectionMockup : public AbstractConnection
{
    Q_OBJECT
public:
    explicit ConnectionMockup(QObject *parent = 0);

    bool isReady() const;
    void sendMessage(const QString &message);

    void test_send_message(const QString &message);

    bool ready;
    QStringList messages;
};

ConnectionMockup::ConnectionMockup(QObject *parent)
    : AbstractConnection(parent)
{
    ready = true;
}

bool ConnectionMockup::isReady() const
{
    return ready;
}

void ConnectionMockup::sendMessage(const QString &message)
{
    messages.append(message);
}

void ConnectionMockup::test_send_message(const QString &message)
{
    emit messageRecieved(message);
}

TestEmcProgram::TestEmcProgram(QObject *parent) :
    QObject(parent)
{
}

void TestEmcProgram::open()
{
    ConnectionMockup mockup;
    EmcProgram …
Run Code Online (Sandbox Code Playgroud)

c++ qt unit-testing

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

在多线程程序中正确使用QSqlDatabase

基于Qt文档:

只能在创建连接的线程中使用连接.不支持在线程之间移动连接或从其他线程创建查询.

困扰我的问题是,当我复制构造数据库实例时会发生什么.例如,这是主线程中的代码:

int main(int argc, char** argv) {
...
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DB1");
    db.setHostName("localhost");
...
Run Code Online (Sandbox Code Playgroud)

这是工作线程中的连接:

void MyThread::run() {
    QSqlDatabase db(QSqlDatabase::database("DB1"));
    if (db.open()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个线程是否安全?通常,这样的操作在C++中是安全的,但由于QT使用隐式共享和线程关联,我不再确定.

他们说:连接只能在创建它的线程中使用,但这意味着什么?QSqlDatabase :: addDatabase 是指创建连接的位置,还是实际调用open()函数时的位置.

更新:

在得到Laszlo Papp的回答,并最终查看Qt源代码之后,我必须说Qt的这部分设计看起来对我来说是有缺陷的.

如果我理解正确,QSqlDatabase使用隐式共享,但不幸的是它不是真正的隐式共享,因为QSqlDatabase实例的复制构造函数在需要时不会创建共享数据的新实例.更糟糕的是,您无法创建临时连接,而是必须使用静态方法addDatabase/removeDatabase,在这种情况下,您必须同步线程以避免名称冲突.

这当然使得在QtConcurrent中使用QSqlDatabase非常困难,特别是如果连接应该深埋在一些抽象之后.由于我们不知道代码将在哪个线程上运行,因此我们无法在两次调用之间保持连接打开.如果我们想要生成动态数量的任务,我们需要确保任务不使用相同的数据库名称.

所有这些让我对设计目标感到疑惑,以及隐式共享是否适合这种特殊情况.恕我直言,更好的解决方案是让复制构造函数真正做到这一点并为你制作一个连接副本.那些不想拥有私有/临时副本的人仍然可以使用addDatebase/removeDatabase,在这种情况下需要修改方法database()以返回引用.

c++ qt multithreading qtsql

17
推荐指数
2
解决办法
8297
查看次数

在java Flux中按对象属性分组

给定以下数据结构Data以及Flux<Data>根据某些属性实现分组为一系列列表的惯用方法是什么:

import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.function.Predicate;

class Scratch {
    private static class Data {
        private Integer key;
        private String value;

        public Data(Integer key, String value) {
            this.key = key;
            this.value = value;
        }

        public Integer getKey() {
            return key;
        }

        public String getValue() {
            return value;
        }

        public static Data of(Integer key, String value) {
            return new Data(key, value);
        }

        @Override
        public String toString() { …
Run Code Online (Sandbox Code Playgroud)

java reactive-programming project-reactor

10
推荐指数
2
解决办法
7130
查看次数

什么是--pp-infra-container-image意味着什么?

kubernetes中pod-infra-container-image的目的是什么?

官方文件只说:

每个pod中的network/ipc命名空间容器将使用的映像.(默认"gcr.io/google_containers/pause-amd64:3.0")

但是我并不完全明白它的作用以及它的工作原理.

kubernetes

8
推荐指数
2
解决办法
3021
查看次数

使用Hadoop处理大量小文件

我正在使用Hadoop示例程序WordCount来处理大量的小文件/网页(cca.2-3 kB).由于这远离hadoop文件的最佳文件大小,因此程序非常慢.我想这是因为设置和撕毁工作的成本远远高于工作本身.这些小文件也会导致文件名的命名空间耗尽.

我读到在这种情况下我应该使用HDFS归档(HAR),但我不知道如何修改此程序WordCount以从此档案中读取.程序可以继续工作而无需修改或需要进行一些修改吗?

即使我在档案中打包了很多文件,问题仍然存在,这是否会提高性能.我读到即使我打包多个文件,一个存档中的这些文件也不会由一个映射器处理,但很多,在我的情况下(我猜)不会提高性能.

如果这个问题太简单,请理解我是Hadoop的新手并且对它的经验很少.

java hadoop mapreduce hdfs

6
推荐指数
1
解决办法
5935
查看次数

在 golang 中, Time.Format() 从小数部分删除尾随零

如何防止 go 的 Time.Format() 从小数部分中删除尾随零?我有以下单元测试失败。

package main

import (
    "testing"
    "time"
)

func TestTimeFormatting(t *testing.T) {
    timestamp := time.Date(2017, 1,2, 3, 4, 5, 600000*1000, time.UTC)
    timestamp_string := timestamp.Format("2006-01-02T15:04:05.999-07:00")
    expected := "2017-01-02T03:04:05.600+00:00"

    if expected != timestamp_string {
        t.Errorf("Invalid timestamp formating, expected %v, got %v", expected, timestamp_string)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ go test
--- FAIL: TestTimeFormatting (0.00s)
    main_test.go:14: Invalid timestamp formating, expected 2017-01-02T03:04:05.600+00:00, got 2017-01-02T03:04:05.6+00:00
FAIL
exit status 1
FAIL    _/home/sasa/Bugs/go-formatter   0.001s
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

go

6
推荐指数
1
解决办法
1268
查看次数

Kubernetes:保留service-cluster-ip-range的子范围以进行手动分配

创建服务时,我可以从群集IP范围指定静态IP地址,也可以不指定任何IP地址,在这种情况下,将动态分配此类地址.

但是,在指定静态IP地址时,如何确保它不会与现有动态分配的IP地址冲突?我可以通过编程方式查询这样的IP地址是否已被使用.或者,我更喜欢的是指定集群保留用于手动分配的IP范围.例如

  • 服务群集IP范围:10.20.0.0/16
  • 服务群集IP手册范围:10.20.5.0/24

现在,我可以自己管理10.20.5.0-10.22.5.255范围内的IP地址,kubernetes可以使用剩余池进行动态分配.排序通常DHCP /静态IP范围在家用路由器上的工作方式.

这种情况在kubernetes中是否可行?

kubernetes

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

rxjs:定期执行一些操作,之间有特定的延迟

客户端应用程序将请求发送到服务器,这可能需要很长时间才能完成。一旦请求完成或失败,客户应该等待的时间(即10秒)一段时间,然后重新发送请求。

当前的工作解决方案是这样的:

appRequest = new Subject();

ngOnInit(): void {
  this.appRequest.delay(10000).subscribe(() => this.refresh());
  this.refresh();
}

refresh() {
  this.api.getApplications().subscribe(a => {
      this.updateApplications(a);
      this.appRequest.next();
    },() => this.appRequest.next()
  );
}
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的解决方案呢?

编辑:

我可以使用与定期计时器,但我不想除非先前请求已经完成发送新的请求。仅在先前的请求完成后,我才需要等待10秒钟,然后再次发送请求。这应该无限期地重复。

getApplications()函数由swagger生成,并且在内部使用angular的http客户端库。目前的看法是,除非你订阅Observable的返回getApplications(),也不会发送请求到服务器。

reactive-programming rxjs angular

4
推荐指数
2
解决办法
3419
查看次数