图片 6

使用sersync实现多台服务器实时同步文件,DotNet指定文件显示的尺寸

Qt 共享库(动态链接库)和静态链接库的创建及调用,qt静态

前言: 编译器 Qt Creator, 系统环境 win7 64 位

 

1.创建共享库:

新建文件或项目->选择 Library 和 c++
库->选择共享库->下一步(工程名为 sharedlib)

图片 1

生成的目录结构如图:

图片 2

修改 sharedlib.h 中的代码:

// sharedlib.h
#ifndef SHAREDLIB_H
#define SHAREDLIB_H

#include "sharedlib_global.h"

class SHAREDLIBSHARED_EXPORT Sharedlib// 导出类, 客户端可直接加载
{

public:
    Sharedlib();
    void test();
};

extern "C" Q_DECL_EXPORT int add(int a, int b);//导出函数, 客户端可用 QLibrary 加载

#endif // SHAREDLIB_H

 

修改 sharedlib.cpp 中的代码:

// sharedlib.cpp
#include "sharedlib.h"

#include <QMessageBox>


Sharedlib::Sharedlib()
{
}

void Sharedlib::test()
{
    QMessageBox::warning(0, "Sharedlib::test", "Sharedlib::test");
}

int add(int a, int b)
{
    return a+b;
}

 

2.调用共享库(方式一):

新建文件或项目->选择 Application,
Qt Console Application->项目名为 app1->下一步

修改客户端程序 main.cpp 中的代码:

// main.cpp
#include <QCoreApplication>
#include <QLibrary>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    typedef int (*Add)(int a, int b);

    QLibrary mylib("sharedlib.dll");

    if(!mylib.load()){// 加载 dll 失败
        cout<<"加载 sharedlib.dll 失败!"<<endl;
        return -1;
    }
    Add add = (Add)mylib.resolve("add");
    if(0 == add){// 加载失败
        cout<<"加载函数 add 失败!"<<endl;
        return -1;
    }

    int sum = add(1,2);// 调用 add 函数

    cout<<sum<<endl;

    return 0;

    return a.exec();
}

 

编译 sharedlib 工程和 app1 工程-> 将生成的 sharedlib.dll 文件复制到
app1.exe 所在目录中->运行 app1.exe 输出 3

总结:这种调用方式需要在客户端程序编译时需要提供 .dll
的名字信息及其函数信息, 需要在客户端程序运行时提供 .dll 文件,
客户端中要写的代码较多.

3.调用共享库(方式二):

新建文件或项目->选择 Application,
Qt QWidgets Application->项目名为 app2->下一步

在 app2.pro 文件最后添加如下代码, 用来说明 sharedlib.lib 的路径信息:

unix|win32: LIBS += -L$$PWD/../build-sharedlib-unknown-Debug/debug/ -lsharedlib

INCLUDEPATH += $$PWD/../build-sharedlib-unknown-Debug/debug
DEPENDPATH += $$PWD/../build-sharedlib-unknown-Debug/debug

 

将 sharedlib 工程源码目录下的 sharedlib.h 和 sharedlib_global.h
头文件复制到 app2 工程源码目录下, 将 sharedlib.dll 文件复制到 app2.exe
所在目录中

修改客户端程序 main.cpp 中的代码:

// main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "sharedlib.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();
    Sharedlib sb;
    sb.test();

    return a.exec();
}

 

编译 app2 工程, 运行 app2.exe, 弹出如图对话框, 表示程序正确执行:

图片 3

总结: 这种调用方式需要在客户端程序编译时提供 .lib 和 .h
文件, 需要在客户端程序运行时提供 .dll 文件,  客户端中要写的代码较少.

4.方式一和方式二调用共享库的异同点:

客户端程序运行时都是只需要 .dll 文件; 编译时有些差别, 方式一代码较多,
但无需 .lib 和 .h 文件, 方式二代码简单(和调用普通类一样), 但是需要 .lib
和 .h 文件.

创建好三个项目后的文件结构如图:

图片 4

  1. 静态链接库的创建:

新建文件或项目->选择 Library 和 c++
库->选择静态链接库->下一步(工程名为 staticdlib)

图片 5

修改 staticlib.h 中的代码:

// staticlib.h
#ifndef STATICLIB_H
#define STATICLIB_H


class Staticlib
{

public:
    Staticlib();
    void test();
};

#endif // STATICLIB_H

 

修改 staticlib.cpp 中的代码:

// staticlib.cpp
#include "staticlib.h"
#include <iostream>
using namespace std;

Staticlib::Staticlib()
{
    cout<<"Staticlib::Staticlib"<<endl;
}

void Staticlib::test()
{
    cout<<"Staticlib::test"<<endl;
}

 

编译工程之后会生成 staticlib.lib 文件

  1. 调用静态链接库:

新建文件或项目->选择 Application, Qt Console Application->项目名为
app->下一步

在 app.pro 文件最后添加如下代码, 用来说明 staticlib.lib 的路径信息:

unix|win32: LIBS += -L$$PWD/../build-staticlib-unknown-Debug/debug/ -lstaticlib

INCLUDEPATH += $$PWD/../build-staticlib-unknown-Debug/debug
DEPENDPATH += $$PWD/../build-staticlib-unknown-Debug/debug

 

将 staticlib 工程目录下的 staticlib.h 复制到 app 工程目录下

修改客户端程序 main.cpp 中的代码:

// main.cpp
#include <QCoreApplication>
#include "staticlib.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Staticlib sb;
    sb.test();

    return a.exec();
}

 

编译 app 工程, 生成 app.exe 文件, 运行 app.exe 文件, 输出如图:

图片 6

总结: 客户端程序编译时需要 .h 和 .lib 文件, 运行时无需其它文件.

  1. 共享库(动态链接库)和静态链接库的异同点:

异: 调用共享库的客户端运行时需要 .dll 文件, 静态链接库的不需要;

      库程序发生改变时, 共享库客户端只需更新 .dll 文件,
静态链接库客户端需要重新编译.

同: 都可用于多模块共同开发程序

 

 注: 本文是原创文章, 欢迎咨询或提出修改意见,
联系方式QQ:[email protected]

源码地址:<a
href=”“></a>

 

共享库(动态链接库)和静态链接库的创建及调用,qt静态 前言: 编译器 Qt
Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目-选择…

一、Sersync项目介绍

DotNet指定文件显示的尺寸,dotnet指定尺寸

 
 在项目中开发中,有时候需要将文件的尺寸进行控制,例如需要将文件的尺寸指定为字节,TB等。现在提供一个方法,实现将指定文件的尺寸,

   提供:”字节”, “KB”, “MB”, “GB”,
“TB”等尺寸的控制选项,一下方法代码可以在项目中直接使用,提高项目的开发效率。

 [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public static class FsLibValueExtract
    {
        readonly static string[] SizeDefinitions = { "字节", "KB", "MB", "GB", "TB" };

        /// <summary>
        /// 控制尺寸显示转换上限
        /// </summary>
        readonly static double SizeLevel = 0x400 * 0.9;

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this double size)
        {
            return ToSizeDescription(size, 2);
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <param name="digits">小数位数</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this double size, int digits)
        {
            var sizeDefine = 0;

            while (sizeDefine < SizeDefinitions.Length && size > SizeLevel)
            {
                size /= 0x400;
                sizeDefine++;
            }

            if (sizeDefine == 0) return size.ToString("#0") + " " + SizeDefinitions[sizeDefine];
            return size.ToString("#0." + string.Empty.PadLeft(digits, '#')) + " " + SizeDefinitions[sizeDefine];
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this ulong size)
        {
            return ((double)size).ToSizeDescription();
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <param name="digits">小数位数</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this ulong size, int digits)
        {
            return ((double)size).ToSizeDescription(digits);
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this long size)
        {
            return ((double)size).ToSizeDescription();
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <param name="digits">小数位数</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this long size, int digits)
        {
            return ((double)size).ToSizeDescription(digits);
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this int size)
        {
            return ((double)size).ToSizeDescription();
        }

        /// <summary>
        /// 转换为尺寸显示方式
        /// </summary>
        /// <param name="size">大小</param>
        /// <param name="digits">小数位数</param>
        /// <returns>尺寸显示方式</returns>
        public static string ToSizeDescription(this int size, int digits)
        {
            return ((double)size).ToSizeDescription(digits);
        }
    }

   以上只是文件尺寸进行一个算术运算,实现以上所述的功能。

在项目中开发中,有时候需要将文件的尺寸进行控制,例如需要将文件的尺寸指定为字节,TB等。…

项目地址:

我们常用到的是rsync+inotify来对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。

目前使用的比较多的同步程序版本是inotify-tools,另外一个是google开源项目Openduckbill(依赖于inotify-tools),这两个都是基于脚本语言编写的,其设计思路同样是采用inotify与rsync命令。
相比较上面两个项目,本项目优点是:

sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

相比较上面两个项目,sersync配置起来很简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。

另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。

本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。

发表评论