随笔 - 64, 文章 - 11, 评论 - 12, 引用 - 0
数据加载中……

2012-8 <中> 疑问

20日
   用visual studio 10.0打开项目,第一次编译项目,报出了“fatal error C1902: 程序数据库管理器不匹配;请检查安装”的错误,但项目在上星期五都能编译成功,
   现在没有修改,却编译失败。编译其它语言的项目不受影响。
      http://msdn.microsoft.com/zh-cn/library/8y7hea02.aspx是关于该问题的官方分析,于是我检查相关的DLL文件,也都存在且版本一致。突然想起周五下午,
      在使用vc10.0中的dumpbin时,提示少了mspdb100.dll文件,我就从Microsoft Visual Studio 10.0\Common7\IDE目录中复制了该文件到
      Microsoft Visual Studio 10.0\VC\bin中,把bin中的该文件删除后,再编译项目就成功了。

23日
   程序每次隔几分钟去查询服务器。响应时间都会更长,特别是数据量少时更是慢。
      通过wireshark工具分析网络包,发现发生这个情况时总是发生了重传并出现了ARP请求应答包。于是试着清除ARP缓存,然后再查询,情况一般都能复现。由此再
      想到网络协议ARP的介绍,得出结论是分片的IP包只有最后一包会由ARP应答处理,之前的都会被丢弃。数据量少时更明显的原因是没有3个以上重复的ACK来告诉
      需要重传,只有等待超时机制,而超时机制一般都需要200多ms,所以现象更明显。

   ARP 缓存表的更新。
       在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下有两个键可用来控制缓存表的更新周期。
      ArpCacheLife   REG_DWORD   0-0xFFFFFFFF(秒数,默认值为120秒):是指没有引用过(也就是和对方没有通信)的缓存项失效时间。
      ArpCacheMinReferencedLife   REG_DWORD   0-0xFFFFFFFF(秒数,默认值为600):是指引用过(也就是和对方有网络通信)的缓存项失效时间。

24日
   程序在服务器上运行,点出关闭,迟迟不能退出。
      用调试器附加进程,查看线程及各自的栈k,分析出有死循环。冻结其它线程~f,于循环判断处下断bp,查看相关存储位置的值dd [ebp-38],更改其值ed [ebp-38]
      查看寄存器eax的值reax,并重新赋值reax=1,从而让程序完成退出时的逻辑。
 
25日
   套接字模式分为两种。
      阻塞模式:在阻塞模式下,I/O操作完成前,执行操作的调用send,recv会一直等候下去,不会立即返回到程序。
      非阻塞模式:在非阻塞模式下,调用send,recv等I/O操作时,操作会立即返回到程序。
   windows上套接字上的I/O模型共有6种。
      阻塞模型:模型使用阻塞模式的套接字,收发线程上进行的都是阻塞调用。特点是简单,缺点是不易扩展。
      select模型:可以同时管理阻塞套按字和非阻塞套接字。
      WSAAsyncSelect模型:可以绑定到窗口的消息上,只能用非阻塞套接字上。
      WSAEventSelect模型:和一个事件句柄关联,只能用非阻塞套接字上。
      Overlapped I/O模型:可以和一个事件句柄或者一个完成回调方法关联,只能用非阻塞套接字上。
      完成端口模型:只能用非阻塞套接字上。

   在一个阻塞或者非阻塞套接字上投递recv操作时,默认的选项的行为是只要有数据就会返回。如果要让套接字收到指定的数据量后才返回,需要在recv调用中指定MSG_WAITALL
   标志。
30日
   MFC对话框上的ENTER,ESC及右上角的关闭按钮处理
      在MFC对话框上按ENTER键
         1:如果当前焦点是在一个按钮上,相当于单击该按钮。
         2:如果当前焦点是在其它类型的控件上时。
            2.1:如果设置了DEFAULT BUTTON按钮,就相当于单击了该默认按钮。
            2.3:如果映射了IDOK消息号,将会调用该消息函数
            2.2:如果没有设置DEFAULT BUTTON按钮,将会调用对话框类的OnOK函数。
      在MFC对话框上按下了ESC键
         1:如果映射了IDCANCEL消息号,将会调用该消息函数。
         2:如果没有映射IDCANCEL消息号,将会调用对话框类的OnCancel函数。
      单击对话框右上角的关闭按钮
         1:如果映射了对话框WM_CLOSE消息,将调用该处理函数OnClose(),基类的OnClose()函数将会调用OnCancel函数。
         2:同在MFC对话框上按下了ESC键处理流程一样。
   参照上述的流程就可以灵活处理对话框上这几个消息,也有人通过重载基类的BOOL PreTranslateMessage(MSG* pMsg) 来处理
      BOOL PreTranslateMessage(MSG* pMsg) 
      {
              // TODO: Add your specialized code here and/or call the base class
              if   (pMsg-> message==WM_KEYDOWN) 
              { 
                      UINT   nkeyc=(UINT)(pMsg-> wParam); 
                      if(nkeyc==VK_ESCAPE) 
                              return TRUE; // 表示已经处理好了,不需再进行处理。
              }

              return CDialog::PreTranslateMessage(pMsg);
      }



      

posted on 2012-08-20 09:22 Robertxiao 阅读(254) 评论(0)  编辑 收藏 引用 所属分类: 问题集锦


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理