Qt君


  • 首页

  • 关于

  • 归档

  • 搜索

C/C++黑魔法-字符串分割

发表于 2019-04-17

方便地将字符串分割。

  • 字符串使用字符指针偏移的方法分割

    1
    printf("%s\n", "123456789" + 3); // 输出:456789
  • 或

    1
    2
    const char *str = "123456789";
    printf("%s\n", str + 3); // 输出:456789

预编译好的WebRTC库(翻译文)

发表于 2019-04-16

本文翻译自https://sourcey.com/precompiled-webrtc-libraries
在开发Webrtc过程中,下载超过10GB的庞然大物和众多的依赖,为加快开发进度。本文介绍怎么获取编译好的Webrtc库。

Webrtc介绍

  WebRTC(Web Real-Time Communication),网页即时通信的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API(音视频的采集、编解码、网络传输、显示等功能)。Webrtc不仅仅应用在网页端,同时还支持跨平台windows,linux,mac,android。
  

关于

  在许多请求之后,我们开始提供WebRTC构建来帮助LibSourcey开发人员。构建中包含了Windows和Linux上本地WebRTC开发所需的所有库和头文件,尽管构建是为LibSourcey开发人员设计的,但它们是完全可移植的,可以被所有人使用。

  WebRTC存储库是一个超过10GB的庞然大物,有无数依赖项,没有从谷歌获得丰厚报酬的开发人员不应该去处理这些依赖项。然而,一旦多余的文件储存空间减少,归档构建的大小就可能降低到50mb左右,包括所有静态库和头文件。Jenny Craig感到很自豪的!

使用方法

  为自己节省创建WebRTC的泪水和挫折。预编译的本地WebRTC库和头文件可在本文末链接打开选择下载。Linux和Windows的调试和发布版本是为x86和x64架构提供的。

  下载与平台系统架构相关的包后解压它们,将它们链接到您的项目,不需要编译任何东西或跳过任何限制。

  在Windows上,您需要7-Zip来提取归档文件,而在Linux上,归档文件是.tar.gz格式的。为了方便起见,所有静态WebRTC库都已合并到单个库中(Windows上的lib webrtc_full.lib和Linux上的lib webrtc_full.a),因此您只需将这一个库与项目链接,即可包含所有WebRTC组件。

  文件夹结构已经设置,因此您可以将同一版本的x64和x86存档文件提取到单个根目录中:

1
2
3
4
5
6
7
8
9
10
webrtc-build/
├── third_party/ <-- webrtc依赖内容
├── webrtc/ <-- webrtc核心内容
└── lib/
├── x64/
│ ├── Debug <-- x64调试库
│ ├── Release <-- x64版本库
├── x86/
│ ├── Debug <-- x86调试库
│ ├── Release <-- x86版本库

构建细节

  Windows库是用Visual Studio 2015 Update 3编译的,而Linux构建是在Ubuntu 16.10上用gcc编译的。

  调试构建是在启用所有调试符号的情况下创建的,并且版本构建已经进行了优化,以获得最大的性能。gn的具体构建选项如下:

1
2
3
4
gn gen out/x86/Debug --args="is_debug=true rtc_include_tests=false target_cpu=\"x86\""
gn gen out/x86/Release --args="is_debug=false rtc_include_tests=false target_cpu=\"x86\" symbol_level=0 enable_nacl=false"
gn gen out/x64/Debug --args="is_debug=true rtc_include_tests=false target_cpu=\"x64\""
gn gen out/x64/Release --args="is_debug=false rtc_include_tests=false target_cpu=\"x64\" symbol_level=0 enable_nacl=false"

预编译好的Webrtc库地址

  • github仓库

    1
    https://github.com/sourcey/webrtc-precompiled-builds
  • 网页端

    1
    https://sourcey.com/precompiled-webrtc-libraries

Qt加载库

发表于 2019-04-15

Qt项目加载库文件,一般时在pro后缀的项目文件上添加。

方法1(常规情况)

  • 在unix系统上-L是连接库目录,而-l则为加载库的名字;
  • 在windows系统下则可以直接添加库;
  • unix系统测试库为:/usr/local/lib/libtest.so;
  • windows系统测试库为:C:/mylibs/test.lib。
    1
    2
    unix:LIBS += -L/usr/local/lib -ltest
    win32:LIBS += C:/mylibs/test.lib

方法2(特殊情况)

  • 库路径存在空格的情况下添加;
  • unix系统下则需要双引号(“”)包含库的路径;
  • windows系统下则需要包含库的路径名字。
    1
    2
    unix:LIBS += "-L/home/user/test libs" -ltest
    win32:LIBS += "C:/mylibs/test libs/test.lib"

总结

  • 上面两种方法无论是unix与windows库的加载方法都可以互为使用。

为什么Vim使用HJKL移动光标

发表于 2019-04-13

ADM-3A设备使用HJKL键在vi编辑器及其后代中移动光标。它在这四个键上印有光标移动箭头。Vim是源自Vi也是使用相同的HJKL键作为方向键。

历史

  ADM-3A是一个早期视频显示终端在1976年引入的,这是由制造利尔西格勒并且具有12英寸的屏幕显示的80个字符12个或24行。它创下了995美元的新行业低单价。由于计算机通信速度的快速提高,以及由于需要廉价的操作员控制台而向市场推出的新型小型计算机系统,它很快在商业上取得了成功。

ADM-3A设备

ADM-3A设备

ADM-3A设备键盘布局

ADM-3A设备键盘布局

Qt线程使用的两种方法

发表于 2019-04-13

QThread类提供一种独立于平台的线程管理方式。

方法1

  一个QThread实例管理程序中的一个线程。QThread的执行开始于run()。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。
  你可以使用QObject::moveToThread()将工作对象移动到线程中使用。

  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    class Worker : public QObject
    {
    Q_OBJECT
    public slots:
    void doWork(const QString &parameter) {
    QString result;
    /* ... here is the expensive or blocking operation ... */
    emit resultReady(result);
    }

    signals:
    void resultReady(const QString &result);
    };

    class Controller : public QObject
    {
    Q_OBJECT
    QThread workerThread;
    public:
    Controller() {
    Worker *worker = new Worker;
    worker->moveToThread(&workerThread);
    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
    connect(this, &Controller::operate, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, this, &Controller::handleResults);
    workerThread.start();
    }

    ~Controller() {
    workerThread.quit();
    workerThread.wait();
    }

    public slots:
    void handleResults(const QString &);

    signals:
    void operate(const QString &);
    };

  将线程移动到工作线程内执行。因为在线程中有队列的信号槽连接机制,所以在不同线程中使用信号槽是安全的。

方法2

  另一种单独在线程中执行的方式是继承QThread后重新实现run()函数(run函数内用户的执行操作)。

  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class WorkerThread : public QThread
    {
    Q_OBJECT
    void run() override {
    QString result;
    /* ... here is the expensive or blocking operation ... */
    emit resultReady(result);
    }
    signals:
    void resultReady(const QString &s);
    };

    void MyObject::startWorkInAThread()
    {
    WorkerThread *workerThread = new WorkerThread(this);
    connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
    connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
    workerThread->start();
    }

关于QtCreator无法响应的一些解决方法

发表于 2019-04-12

解决使用QT Creator编辑项目或打开项目时无法响应的现象。

方法1

将NVIDIA控制面板设置成自动选择,或改为集显即可解决.

方法2

使用管理员权限打开。

Linux使用select接口的高精确延时

发表于 2019-04-10

使用select接口写高精确延时。

select接口

int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

原理

  • 利用select的timeout参数实现定时器;
  • 设置timeval的值,而将其他参数都置为NULL,当内部时间耗尽后select便会退出。

示例

1
2
3
4
5
6
7
8
9
10
11
void usleep(unsigned long usec)
{
struct timeval tv;
tv.tv_sec = usec / 1000000;
tv.tv_usec = usec % 1000000;

int err;
do {
err = select(0, NULL, NULL, NULL, &tv);
} while(err < 0 && errno == EINTR);
}

注意

  • 内核支持的延时分辨率一般不能达到微秒级;
  • 由于存在内核调度延时现象;
  • 内核分辨率一般为10ms的倍数。

vim常用命令

发表于 2019-04-10

Vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。

命令 含义
Esc 切换到命令行模式
a 在当前光标的右边插入
dd 剪切当前行
yy 拷贝当前行
p 将剪贴板内容复制到光标后
:wq 保存并退出
:q! 强制退出并忽略所有更改
/text 查找text,按n健查找下一个,按N健查找上一个

刷新QML翻译接口

发表于 2019-04-08

刷新使用标记为翻译的字符串的所有绑定表达式。

使用

  • 使用void QQmlEngine::retranslate()前需要使用QCoreApplication::installTranslator安装翻译文件

注意

  • 由于实现的限制,此函数刷新所有引擎的绑定,而不仅仅是那些使用标记为转换的字符串的绑定。这可以在将来的版本中进行优化;
  • 该功能在Qt 5.10中引入。

windows下获取dns地址

发表于 2019-04-08

利用nslookup获取dns服务器地址,再通过正则表达式过滤。

1. 利用nslookup获取服务器信息

  • process.start("cmd", QStringList()<<"/c"<<"nslookup %COMPUTERNAME% | findstr /i address");
  • /i为匹配不区分大小写。

2. 正则筛选dns

  • QRegExp reg("[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}")
  • reg.cap(0)为dns地址;

3. 运行示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
#include <QRegExp>

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

QProcess process;
process.start("cmd", QStringList()<<"/c"<<"nslookup %COMPUTERNAME% | findstr /i address");
process.waitForStarted(3000);
process.waitForFinished(3000);
QString info = process.readAllStandardOutput().trimmed();

QStringList infos = info.split("\r\n");

QRegExp reg("[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}");
QString dns;
for (int i = 0; i < infos.count(); i++) {
if (reg.indexIn(infos.at(i)) != -1) {
dns = reg.cap(0);
break;
}
}

return a.exec();
}
1…222324…32
Qt君

Qt君

313 日志
41 标签
© 2019 Qt君
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
粤ICP备 - 16070052号