随笔(2013.9)

来源:互联网 发布:淘宝申请售后换货 编辑:程序博客网 时间:2024/06/15 04:50
1.FireBird
使用IBExpert软件可以管理Firdbird数据库,其中打开后有一下几个tag,Domains,这个其实是用户自定义类型,和它的名字域关系不大,还有一个Generators,这个也是比较特殊的,是线程安全的计数器,可以使用成一个自增加的id,还有一个UDFs,这个从名字上可以看出来,叫做用户自定义函数。


2.动态加载dll文件
ace中有ACE_DLL类可以实现,具体的使用和LoadLibrary差不太多,LoadLibrary的使用以前提到过http://blog.csdn.net/ysu108/article/details/8963432。都是先加载库,然后得到函数指针。而ACE_DLL类的open方法可以加载一个dll,symbol方法可以获取一个函数指针。


3.PAC模式MVC模式
MVC模式用的更多,structs和spring等很多框架都是MVC模式,一般web上MVC比较常见。PAC网上提的比较少,貌似和MVC模式有点类似,以后慢慢总结。


4.进程有自己独立的地址空间,这样做对开发人员和用户都有好处,一个进程不会影响到其他进程,但是这样做使得进程之间通讯比较复杂,有得必有失。windows感觉和linux操作系统对于进程和线程处理很多都相同。


5.COM组建与ax文件:COM的最大特点:复用。在WINDOWS中,把DLL放置在一些公共位置(WINDOWS下的SYSTEM32中)也能达到复用,但是,如果把DLL放置在应用文件夹中,则可以被优先使用,容易导致问题。还有COM比dll文件形式安全一点。
COM注册:通过注册,定义COM对象的统一入口(通常是一个GUID),所有的应用里使用这个COM的时候,其实都是使用这个GUID的。COM的GUID:并非是唯一的,只是说,提供的服务接口是唯一的,因为的COM不同版本可能会有不同的GUID,此时,这个COM的服务GUID就用于指明具体实现COM的GUID(或DLL/OCX文件)。COM注册的行为:登记COM的GUID信息,同时指明这个COM的GUID指向的实际的模块(DLL/OCX)文件或版本GUID。除了统一入口点COM还可以被web等其他接口调用是一种工业标注(虽然只有window支持),网页上更多是ActiveX控件。
ax文件一般是媒体的解码文件,同样使用的时候必须注册到注册表。
COM组建即使注册表里面没有注册,整个程序也可以顺利的进行,但是如果dll文件找不到,exe文件就不能打开,因为进程在开始的时候会把所有dll文件信息加载到导入段并把dll加载到自己的虚拟内存空间。对比还是使用dll文件比较好,否则使用COM和ax格式的,都要注册,没有注册成功直接播放视频什么的会不成功。
如何区分COM和DLL,只要看导出函数,一般COM只有四个导出函数:
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer


6.服务器重连
使用TCP协议通信,自定义通信包,比较简单的做法是search包头,而且后面的包都要search包头匹配,否则第一包正确接收如果认为后面紧接着就是第二包,那么可能中间有脏数据。这种情况可以发生在传输一个TCP自定义数据包的时候,一个包发送一半就失败,重连后再发送数据,这个时候后面的包的数据半包就相当于脏数据了。


7.最好使用前缀的++,后缀的++效率可能不如前缀的,后缀的++在实现的时候要保存一个副本。cppcheck:“Pre-increment/decrement can be more efficient than post-increment/decrement. Post-increment/decrement usually involves keeping a copy of the previous value around and adds a little extra code.”


8.cppcheck:Checking for 'm_members' emptiness might be inefficient. Using m_members.empty() instead of m_members.size() can be faster. m_members.size() can take linear time but m_members.empty() is guaranteed to take constant time.


9.dll调试的时候,null释放两次如果在断点前会直接报错。设置的时候dll的RunTimeLibray使用Multiythreaded dll,而exe文件的RunTimeLibray使用Mutithreaded
什么是C Runtime 函数库的多线程版本


当C runtime 函数库于1970s 年代产生出来时,PC 的内存容量还很小,多任务是个新奇观念,更别提什么多执行线程了。因此以当时产品为基础所演化的C runtime 函数库在多线程(multithreaded)的表现上有严重问题,无法被多线程程序使用。利用各种同步机制(synchronous mechanism)如critical section、mutex、semaphore、event,可以重新开发一套支持多执行线程的runtime 函数库。问题是,加上这样的能力,可能导至程序代码大小和执行效率都遭受不良波及-- 即使你只激活了一个执行线程。Visual C++ 的折衷方案是提供两种版本的C runtime 函数库。一种版本给单线程程序使用,一种版本给多线程程序使用。多线程版本的重大改变是,第一,变量如errno者现在变成每个执行线程各拥有一个。第二,多线程版中的数据结构以同步机制加以保护。
Visual C++ 一共有六个C runtime 函数库产品供你选择:
  Single-Threaded(static) libc.lib 898,826
  Multithreaded(static) libcmt.lib 951,142
  Multithreaded DLL msvcrt.lib 5,510,000
  Debug Single-Threaded(static) libcd.lib 2,374,542
  Debug Multithreaded(static)libcmtd.lib 2,949,190
  Debug Multithreaded DLL msvcrtd.lib 803,418
Visual C++ 编译器提供下列选项,让我们决定使用哪一个C runtime 函数库:
  /ML Single-Threaded(static)
  /MT Multithreaded(static)
  /MD Multithreaded DLL(dynamic import library)
  /MLd Debug Single-Threaded(static)
  /MTd Debug Multithreaded(static)
  /MDd Debug Multithreaded DLL(dynamic import library)


 
10.发送数据先考虑是否连接建立,然后建立连接在发送数据,其实是一种对长连接发送大量数据的方法,如果数据量很大,应该使用长连接发送,如果发送的时候连接没有建立,那么要很大的缓存来处理要发送的数据,这个时候数据拷贝和缓存占用空间角度来看,对效率上得不偿失。而发送小数据量可以使用放到缓存队列,底层短连接有自己的缓存队列,不用考虑是否连接成功,典型的Reactor模式,设置一个buffer,创建一个连接就OK了,不用管了,然后异步连接成功的时候会自动发送buffer里面的东西。


11. 异步框架,在Send之后能直接调用Close么?会不会没有发完,还是底层自己排队发送?


12. 一个bug编译器不会报错:当类里面有一个指针成员CType *m_p, 但是在初始化的时候使用 CType *m_p = new CType;编译器不会提示错误,实际上是定义了一个新的p,属于重复定义.


13.短连接,发送的时候调用会立刻生成一个handle,框架底层的handle与操作系统的handle不一样,框架生成的handle是自己生成的,这样就可以在发送的时候保存handle,而不用等到OnConnect的时候。而有一种长连接Send的时候返回的是是否发送成功,这个时候就要特别注意,因为这种连接可能没有连接上,发送前要判断下是否连接成功。


14.编译的时候可以静态添加一个服务,但是必须注意顺序,要服务Server初始化完成后再添加。


15.application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。


16.如果全部是异步处理就没有必要使用命令池,来了个任务就异步发送出去,等待任务处理结果,使用单线程就可以了,但是应用的时候要特别注意不要同步处理,否则会非常影响性能。


17.get post 区别:GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息
1)查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=value1&name2=value2
而查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
2)当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。而POST方法对数据长度没有限制

原创粉丝点击