小编rnd*_*gen的帖子

串行通讯,延迟最小

我有一台通过串行通信(即物理或仿真串行端口的RS-232 / RS-422)与外部设备连接的计算机。它们通过频繁的数据交换(30Hz)相互通信,但是只有很小的数据包(每个数据包少于16个字节)。

通信的最关键要求是低延迟或发送和接收之间的延迟。

数据交换模式类似于握手。一个主机设备启动通信,并继续在客户端设备上发送通知。客户端设备需要尽快回复来自主机设备的每个通知(这正是需要实现低延迟的地方)。通知和回复的数据包定义明确;即数据长度是已知的。并且基本上不允许数据丢失。

我使用以下常见的Win API函数以同步方式进行I / O读/写:CreateFile,ReadFile,WriteFile

客户端设备使用ReadFile从主机设备读取数据。客户端读取完长度已知的完整数据包后,便使用WriteFile用相应的数据包答复主机设备。读取和写入始终是连续的,没有并发性。

通讯速度不够快。即数据发送和接收之间的时间间隔太长。我想这可能是串行端口缓冲或中断的问题。

在这里,我总结了一些可以改善延迟的可能措施。请给我一些建议和更正:)

  1. 调用带有FILE_FLAG_NO_BUFFERING标志的CreateFile?我不确定此标志在此情况下是否相关。
  2. 在每个WriteFile之后调用FlushFileBuffers?或可以通知/中断串行端口立即传输数据的任何操作?
  3. 为处理串行通信的线程和进程设置更高的优先级
  4. 为仿真设备(及其驱动程序)设置等待时间计时器或传输大小。但是物理串口呢?
  5. Windows上是否有任何等效的东西,例如Linux下的setserial / low_latency?
  6. 禁用FIFO?

提前致谢!

windows hardware winapi serial-port low-latency

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

使用tempate类型参数列表中的TYPE

我想使用类模板参数列表中的类型信息.

快速解决方法的工作示例:

struct NoParam {};
template< typename A = NoParam,
          typename B = NoParam,
          typename C = NoParam,
          typename D = NoParam,
          typename E = NoParam,
          typename F = NoParam >
struct TypeList
{
  typedef A T1;
  typedef B T2;
  typedef C T3;
  typedef D T4;
  typedef E T5;
  typedef F T6;
};

template<typename... Types>
class Application
{
   Application()
   {
      // the actual code will store the created instances in a tuple or map..
      std::make_unique< TypeList<Types...>::T1 > (); …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-functions c++11 c++14

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

如何安全删除多个指针

我有一些代码使用了许多指向同一地址的指针.给出一个相同的简单示例:

int *p =  new int(1);
int *q = p;
int *r = q;

delete r; r = NULL; // ok
// delete q; q = NULL; // NOT ok
// delete p; p = NULL; // NOT ok
Run Code Online (Sandbox Code Playgroud)

如何安全地删除它而不需要多次删除?如果我有很多指针都指向同一地址的对象,那么这一点尤其困难.

c++ memory pointers delete-operator

5
推荐指数
3
解决办法
4333
查看次数

从2D投影映射回3D点云

我有一个由点顶点(XYZ)和最终三角形面组成的3D模型.使用OpenGL或相机视图矩阵投影我可以将3D模型投影到2D平面,即视图窗口或具有m*n分辨率的图像.

问题是如何确定来自2D投影计划的像素与其与原始3D模型相对应的顶点(或面)之间的对应关系.

也就是说,
2D投影中给定像素的3D模型中最接近的顶点是什么?
这听起来像是在openGL或光线追踪问题中挑选.是否有任何简单的解决方案?

通过光线跟踪的想法,它实际上是关于从视点找到与光线相交的第一个顶点/面.有人能给我看一些教程或例子吗?我想找到一个独立于使用OpenGL的算法.

opengl 3d raytracing projection hittest

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

关于c ++友谊和VC12和VC14继承的不同行为

class Base 
{
protected:
    void func1();
};

class Derived : public Base
{
friend class Third;
};

class Third
{
     void foo() 
     {
        Derive d;
        d.func1();
     }
};
Run Code Online (Sandbox Code Playgroud)

我可以编译VC14(Visual Studio 2015)中的代码但是没有错误,但从VC12中获取错误(Visual Studio 2013)

cannot access protected member declared in class 'Base'
Run Code Online (Sandbox Code Playgroud)

谁对吗?具有继承权的这种自由的正确性是什么?

来自MSDN https://msdn.microsoft.com/en-us/library/465sdshe.aspxhttp://en.cppreference.com/w/cpp/language/friend看起来这种友谊不是传递性的,不可能是遗传.但是我认为这个代码示例的情况并非如此.

但为什么VC14不会给我一个错误?

如果VC14是正确的,我怎么能"修改"代码,这样VC12也可以呢?在类Derived中再次定义受保护的func1()?

c++ inheritance friend visual-studio

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

多个C++删除多个对象指向的内存

另一个C++指针删除问题在以下示例中:

class Foo {
public:
    int *p;
    ~Foo() {
        delete p; p = NULL;
    }
};

Foo *f1 = new Foo();
Foo *f2 = new Foo();
f1->p = new int(1);
f2->p = f1->p;
delete f2; // ok
delete f1; // no error?
Run Code Online (Sandbox Code Playgroud)

为什么我在调用"删除f1"时没有收到错误?我没有删除两次相同的地址(*p)吗?

如果我直接删除最后两行代码中的指针,我将收到错误.

delete f2->p; // ok
delete f1->p; // error!! *** glibc detected *** double free or corruption (fasttop) ***
Run Code Online (Sandbox Code Playgroud)

c++ memory delete-operator

4
推荐指数
1
解决办法
609
查看次数

如何交叉引用已经存在的 doxygen 文档?

我有两个 C++ 项目 A 和 B;依赖关系只是 B 到 A。

B  --> A
Run Code Online (Sandbox Code Playgroud)

我想分别在 A 和 B 上分别运行 Doxygen,但仍然让我可以从 B 文档中交叉引用 A。(也就是说,当我浏览 B 文档时,如果 B 中使用了来自 A 的任何类,我可以直接链接到 A 文档)。

——

[回复来自 0x4b 的答案:] 如果我将“CREATE_SUBDIRS”设置为 YES 并使用标签文件的相对路径,Doxygen 会以某种方式做出错误的链接引用。

我确实遵循了这个例子。

 <root>
    +- proj
    |   +- html               HTML output directory for proj   
    |       +- d1
    |       |   +- d2
    |       |       .... (*.html)
    |       | 
    |         ...(*.html)
    |   +- src                sources for proj
    +- ext1
    |   +- html               HTML output directory for ext1 …
Run Code Online (Sandbox Code Playgroud)

c++ documentation doxygen

4
推荐指数
1
解决办法
2717
查看次数

在没有Xcode IDE的情况下开发C++

我想在mac os上开发C++程序,我已经安装了Xcode和一堆框架.

但是我想编写没有Xcode IDE的代码,只需编写我自己的makefile并直接编译/链接gcc(随Xcode一起提供).

以opengl程序为例.我试着用命令编译它:

gcc -I/usr/include/-I/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/GLUT.framework/Headers/-I/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/OpenGL.framework/Headers -L/usr/lib -L ​​/ usr/X11/lib/-L/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/OpenGL.framework/Libraries/-lGL - lGLU -lGLUTt main.cpp

要么

gcc -I/usr/include/-L/usr/lib -framework OpenGL -framework GLUT -lm main.cpp

但他们最终导致链接错误

未定义的符号:
"std :: basic_ostream

:: operator <<(long)",引用自:ccKBRSF9.o中的reshape(int,int).在ccKBRSF9.o"___gxx_personality_v0"中的display(),引用自:___ gxx_personality_v0 $ cc_BRKFF中的non_lazy_ptr(也许你的意思是:___ gxx_personality_v0 $ non_lazy_ptr) "的std ::的ios_base ::初始化::〜的init()",从引用:在ccKBRSF9.o ___tcf_0 "的std :: basic_string的,性病::分配器::运算符[](unsigned long类型)常量",引用from:std :: __ verify_grouping(char const*,unsigned long,std :: basic_string,std :: allocator> const&)在ccKBRSF9.o std :: __ verify_grouping(char const*,unsigned long,std :: basic_string,std :: ccKBRSF9.o中的allocator> const&)std :: __ verify_grouping(char const*,unsigned long,std ::在ccKBRSF9.o basic_string的,标准::分配器>常量和) "的std :: basic_ostream>&的std ::运算符<<(STD :: …

c++ opengl xcode operating-system max

3
推荐指数
1
解决办法
1055
查看次数

填充c ++在循环范围内映射内容

我尝试在循环范围内填充c ++映射的内容.

#include <set>
#include <map>

map<int, set<int> > maps;

for (int i=0; i<10; i++) {
   set<int> seti;    // content: a set of integers
   seti.insert(i);
   seti.insert(...);
   maps.insert ( pair<int,set<int> >(i,seti) );
}
Run Code Online (Sandbox Code Playgroud)

问题是:maps.insert是否复制了这对内容?如果在每个循环范围之后对实例无效,则此类代码应该失败.

我应该如何正确生成地图内容(使用指针和新实例?)以及如何正确地清理地图?

感谢您对最佳实践的任何建议.

---更新---

map<int, set<int> >::iterator it;
int k      = (*it).first;     
set<int> v = (*it).second;       
Run Code Online (Sandbox Code Playgroud)

现在'v'也是从地图中存储的真实实例复制的一个?
如果是的话,我无法"直接"更新地图内容.

c++ scope map set

3
推荐指数
1
解决办法
3415
查看次数

基本的SQL原子性"UPDATE ... SET .. WHERE ..."

关于"UPDATE ... SET .. WHERE ..."声明的原子性,我有一个相当基本和普遍的问题.

有一张桌子(没有额外的约束),

+----------+
| id | name|
+----------+
|  1 |  a  |
+----+-----+
Run Code Online (Sandbox Code Playgroud)

现在,我将"同时"执行以下4个语句(同时).

UPDATE table SET name='b1' WHERE name='a'
UPDATE table SET name='b2' WHERE name='a'
UPDATE table SET name='b3' WHERE name='a'
UPDATE table SET name='b4' WHERE name='a'
Run Code Online (Sandbox Code Playgroud)

是否只有一个UPDATE语句将与表更新一起执行?或者,多个UPDATE语句是否可以真正更新表?

我是否需要额外的事务或锁定才能让一个UPDATE写入值到表中?

谢谢

[编辑] 4个UPDATE语句从不同进程并行执行.[编辑]与Postgresql

sql atomicity

2
推荐指数
1
解决办法
7525
查看次数