我有一台通过串行通信(即物理或仿真串行端口的RS-232 / RS-422)与外部设备连接的计算机。它们通过频繁的数据交换(30Hz)相互通信,但是只有很小的数据包(每个数据包少于16个字节)。
通信的最关键要求是低延迟或发送和接收之间的延迟。
数据交换模式类似于握手。一个主机设备启动通信,并继续在客户端设备上发送通知。客户端设备需要尽快回复来自主机设备的每个通知(这正是需要实现低延迟的地方)。通知和回复的数据包定义明确;即数据长度是已知的。并且基本上不允许数据丢失。
我使用以下常见的Win API函数以同步方式进行I / O读/写:CreateFile,ReadFile,WriteFile
客户端设备使用ReadFile从主机设备读取数据。客户端读取完长度已知的完整数据包后,便使用WriteFile用相应的数据包答复主机设备。读取和写入始终是连续的,没有并发性。
通讯速度不够快。即数据发送和接收之间的时间间隔太长。我想这可能是串行端口缓冲或中断的问题。
在这里,我总结了一些可以改善延迟的可能措施。请给我一些建议和更正:)
提前致谢!
我想使用类模板参数列表中的类型信息.
快速解决方法的工作示例:
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) 我有一些代码使用了许多指向同一地址的指针.给出一个相同的简单示例:
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)
如何安全地删除它而不需要多次删除?如果我有很多指针都指向同一地址的对象,那么这一点尤其困难.
我有一个由点顶点(XYZ)和最终三角形面组成的3D模型.使用OpenGL或相机视图矩阵投影我可以将3D模型投影到2D平面,即视图窗口或具有m*n分辨率的图像.
问题是如何确定来自2D投影计划的像素与其与原始3D模型相对应的顶点(或面)之间的对应关系.
也就是说,
2D投影中给定像素的3D模型中最接近的顶点是什么?
这听起来像是在openGL或光线追踪问题中挑选.是否有任何简单的解决方案?
通过光线跟踪的想法,它实际上是关于从视点找到与光线相交的第一个顶点/面.有人能给我看一些教程或例子吗?我想找到一个独立于使用OpenGL的算法.
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.aspx或http://en.cppreference.com/w/cpp/language/friend看起来这种友谊不是传递性的,不可能是遗传.但是我认为这个代码示例的情况并非如此.
但为什么VC14不会给我一个错误?
如果VC14是正确的,我怎么能"修改"代码,这样VC12也可以呢?在类Derived中再次定义受保护的func1()?
另一个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++ 项目 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) 我想在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 ++映射的内容.
#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'也是从地图中存储的真实实例复制的一个?
如果是的话,我无法"直接"更新地图内容.
关于"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