Classes that satisfy certain conditions are allowed, but not required, to end with an Interface suffix.
link

Definition:

A class is a pure interface if it meets the following requirements:

  • It has only public pure virtual ("= 0") methods and static methods (but see below for destructor).
  • It may not have non-static data members.
  • It need not have any constructors defined. If a constructor is provided, it must take no arguments and it must be protected.
  • If it is a subclass, it may only be derived from classes that satisfy these conditions and are tagged with the Interface suffix.

An interface class can never be directly instantiated because of the pure virtual method(s) it declares. To make sure all implementations of the interface can be destroyed correctly, they must also declare a virtual destructor (in an exception to the first rule, this should not be pure). See Stroustrup, The C++ Programming Language, 3rd edition, section 12.4 for details.

Pros: Tagging a class with the Interface suffix lets others know that they must not add implemented methods or non static data members. This is particularly important in the case of multiple inheritance. Additionally, the interface concept is already well-understood by Java programmers.

Cons: The Interface suffix lengthens the class name, which can make it harder to read and understand. Also, the interface property may be considered an implementation detail that shouldn't be exposed to clients.

Decision: A class may end with Interface only if it meets the above requirements. We do not require the converse, however: classes that meet the above requirements are not required to end with Interface.


posted @ 2008-10-07 14:39 micheal's tech 阅读(400) | 评论 (0)编辑 收藏

大家知道MOBIL5.0开始,EVC4开发的工程就无法进行DEBUG了,而必须使用VS.NET2005中的VC++来实现。但是以前我们费了很大心力做成的项目,也不能重新来写。
今天通过一上午的研究,将转化方法贴出来和大家共勉。
       这里我们以DIALOG BASED工程为例。首先用EVC4建立一个DIALOG BASED的POCKET PC 2003工程。此工程名我们暂定为TXDEMO。我们也可以在对话框放置一个BUTTON,在单击事件里,添加 AfxMessageBox(L”Test”); 以便升级到VS.NET 2005后,测试资源对应情况。
       此时,保存TXDEMO工程,并关闭掉EVC4开发工具。此时用VS.NET 2005打开TXDEMO.VCW工程,并接受转换请求。此时并将编译环境切换到Windows Mobile 5.0 pocket pc sdk。编译工程,此时会提示如下错误:
 
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxver_.h(77) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
 
这里我们通过打开Project properties对话框里,切换到C/C++->Code generation页,将Runtime Libarary 设置成“Multi-threaded DLL(/MD)”。即可解决此问题。
 
接着编译工程,此时会提示如下错误:
1>.\TXDEMO.rc(170) : fatal error RC1015: cannot open include file 'wceres.rc'.
 
这里我们需要在TXDEMO.RC文件里,将#include "wceres.rc"注释掉。
//#include "wceres.rc"     // WCE-specific components
 
接着编译工程,此时会提示如下错误:
1>corelibc.lib(wwinmain.obj) : error LNK2019: unresolved external symbol wWinMain referenced in function wWinMainCRTStartup
1>Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug/TXDEMO.exe : fatal error LNK1120: 1 unresolved externals
此时,我们依旧打开project properties对话框,切换到Linker->Advanced页,将Entry Point由wWinMainCRTStartup改成WinMainCRTStartup。
 
此时再次编译,系统不在提示错误,但是编译好的程序,还不能在模拟器或者MOBILE5.0 POCKET PC的机器上运行。
 
我们接着设置项目属性,在Configuration Properties->Gengeral页将Use of MFC ,改成静态连接。
 
此时我们运行程序 ,您会发现程序启动后,就立刻退去。经过我的研究,发现是加载对话框资源失败,在此我们再此打开TXDEMO.RC源文件,
找到IDD_TXDEMO_DIALOG DIALOG DISCARDABLE 0, 0, 130, 90语句,将下面的窗体属性改成如下,即可。
WS_POPUP | WS_VISIBLE | WS_CAPTION
此时,再次编译工程,你可以进行DEBUG并可以运行程序。
这是我对EVC4升级到VS.NET 2005一点总结,其中参考了MSDN中一些文档,但是MSDN说的还不够详细,通过我自己的研究,总结出一点经验,希望能给大家带来方便,谢谢。
 eric.wong
 msn:wbcpcpwb@hotmail.com
我遇到的问题与上述问题几乎相似,但是对话框出了问题

I have an app I ported from eVC 3.0 to VS2005, and when I run it, I get
the following error in the debug window:

ERROR: dialog template has DS_MODALFRAME set, which is not supported
for Pocket PC and Smartphone

And then I get a data abort and an unhandled exception error, and
everything just goes straight to hell.

According to Microsoft this is a feature removed in MFC 8.0. If that's
true, how do I get a floating modal dialog style application using MFC
8 without this style? Every style I try seems to want to come up
full-screen now.

Thanks,
PaulH

我试着用别的对话框来实现,
http://www.cppblog.com/michaelgao/archive/2008/10/03/63200.html





posted @ 2008-10-03 21:59 micheal's tech 阅读(1960) | 评论 (0)编辑 收藏

Windows 对话框
  顾名思义,对话框是应用程序创建的一个窗口,给出用户一些信息或者接收用户的输入。Delphi 中没有创建对话框的 模板(除了通用的对话框如打开对话框、字体对话框、颜色对话框等)。Delphi 本身使用 TForm 创建对话框。对话框可以使得临时输入的窗口创建 更加容易。不用 CreateWindow( ) 创建一个弹出窗口然后在上面添加控件,你只要制作一个资源模板,然后调用 DialogBox 就可以 了。本例中我们创建并使用资源模板,然后调用 Windows DialogBox( ) 函数。你可以参考 Win32 API 帮助的 “Dialog Boxes”部分。在程序示例里我使用 DialogBox( ) 创建了一个模式对话框。你需要为它准备好一个对话框资源文件 “Dlg1.RES”。 


对话框资源的创建
  你需要使用 brcc32.exe 编译对话框资源。这在 Delphi 帮助文档中没有详细说明。下面我们开始创建一个非常简单的对话框资源 .RC 文件。

First DIALOG  12, 10, 206, 86
     STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION
     CAPTION " A Dialog Form"
     FONT 10, "MS Sans Serif"
     {
     LTEXT "Simple Dialog"  200, 8, 6, 196, 8
     PUSHBUTTON "OK"   IDOK, 48, 71,  32, 12
     }

  这是 C 语言代码,不是 Pascal 代码。第一个“First”是资源名字,就像下面一行的“MyIcon”。

MyIcon  ICON  Floppy.ico

对于 .RC 文件内的图标,DIALOG 是一种资源,12、10、206、86 是对话框的标准的上、左、宽、高参数(单位不是像素,对话框单位参 见 Win32 API 帮助的“GetDialogBaseUnits”)。上和左与它的父窗体的上和左相关,以父窗体为参考原点。接下里来 是:STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION ,这些设置了对话框窗体的创建风格( C 语言中 的 | 和 Pascal 语言中的 or 一样)。还有一些其他的对话框风格:

DS_LOCALEDIT -指定编辑框控件在对话框上 使用程序数据模块的内存。默认情况下,对话框上的编辑框控件是使用应用程序数据模块之外的内存的。如果没有使用这个标志,那么不要向编辑框发 送 EM_GETHANDLE 和 EM_SETHANDLE 消息,因为控件没有存储在程序的数据模块。

DS_MODALFRAME -创建一个模式对话框,对话框可以通过指定 WS_CAPTION 和 WS_SYSMENU 结合标题栏和系统菜单。

DS_NOIDLEMSG -禁止 Windows 或其它程序在对话框显示时向它的 owner 窗体发送 WM_ENTERIDLE 消息。

DS_SYSMODAL -创建一个系统的模式对话框。

如果你使用了 WS_CAPTION 风格,那么“CAPTION " A Dialog Form"”这行将在对话框标题上放上这个字符 串,“FONT 10, "MS Sans Serif"”将会设置对话框内所有控件字体和尺寸。{ 和 } 对应 Pascal 中 的 begin 和 end ,在 { } 之间你可以放置希望出现在对话框上的控件,PUSHBUTTON 是一个按钮,参数跟 在 PUSHBUTTON 之后,形式如:
PUSHBUTTON "Text on Control" IDNUMBER, Left, Top, Width, Height 后面的参数为对话框单位而不是像素。这里创建的对话框 206 单位宽、86 单位高、左侧距父窗体 12 单位、顶部距父窗体 10 单位,对话框 上有静态文本框和按钮两个控件。

其他对话框控件
  对话框控件的语法形式为:
controlName text, IDnumber, Left, Top, Width, Height, style, extended-style

DEFPUSHBUTTON "Cancel" IDCANCEL, 8, 67,  32, 12
LTEXT "Static Text Left aligned"  201, 5, 21, 196, 24
CTEXT "Static Text Centered"     202, 18, 12, 170, 8
ICON  "Icon" -1, 1,1,0,0
EDITTEXT 300, 9, 47, 180, 50, ES_MULTILINE, WS_EX_CLIENTEDGE
CHECKBOX "Check Box", 100, 10, 60, 69, 8
AUTOCHECKBOX "Auto CheckBox", 101, 140, 60, 61, 8
RADIOBUTTON "radio", 400, 8, 32, 64, 8
AUTORADIOBUTTON "needs WS_GROUP", 401, 8, 42, 64, 8, WS_GROUP
GROUPBOX "GroupBox", -1, 4,22,150,42
   
你可以通过放置控件类型名字参数创建大部分 Windows 控件,参见下文的“在对话框中包含常规控件”部分。

  使用 DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc);
参 见程序代码的“procedure DoDialog”,你会发现它设置对话框使用的一些变量,然后调用 DialogBox( )。 lpTemplate 为资源名称的 PChar 类型,父窗体为 hForm1 ,lpDialogFunc 设置为对话框函数的地址(参见帮助中 的 DialogProc 部分)。这个 DialogProc 类似于 WndProc ,用于获取对话框消息,参见代码中 的 DialogProc 。 WM_INITDIALOG 消息被发送后对话框就被创建了,因此你可以在这里设置控件。由于对话框是从模板创建的,所以 控件的句柄还不知道,这样可以用 ID 号码访问它们。通过 GetDlgItem(hWnd,IDNUMBER) 获取控件的句柄,你可以使用大量控件 的 SendMessage 或者状态变化(Enable( ) 等)。有几个特定的对话框函数根据 ID 编号直接使用 (SendDlgItemMessage、 CheckDlgButton、 SetDlgItemText、 GetDlgItemText)。 在 WM_COMMAND 消息中,LOWORD(wParam) 就是控件的 ID 号码。


有待完善…… 


对于本文的对话框演示程序,使用的“Dlg1.rc”源文件代码如下:

Z1 ICON Done2.ICO
Z2 ICON Flop.ICO

First DIALOG  12, 10, 206, 86
     STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION | WS_SYSMENU
     CAPTION " A Dialog Form"
     FONT 10, "MS Sans Serif"
     {
     CTEXT "Dialogs are really NON Delphi" 200, 18, 1, 170, 10
     ICON  "Z1" -1, 1,1,0,0
     ICON  "Z2" -1, 189,1,0,0
     CTEXT "Checkbox was Unchecked"     201, 18, 12, 170, 8
     LTEXT " "  202, 5, 21, 196, 24
     EDITTEXT      300, 14, 47, 100, 10
     AUTOCHECKBOX "Show MessageBox", 100, 10, 60, 69, 8
     AUTOCHECKBOX "Check me", 101, 140, 60, 61, 8
     DEFPUSHBUTTON "OK"   IDOK, 48, 71,  32, 12, WS_GROUP
     PUSHBUTTON "set Edit Text"   401, 108, 71,  44, 12,
     }
 
  使用 brcc32.exe 编译 Dlg1.rc 文件,我不知道为什么可以不使用“ #include <windows.h>”,但是确实通过编译了(生成 Dlg1.RES 文件)。

对话框程序
  本程序演示了创建与使用 Windows 对话框的方法,你需要使用上面代码编译得到的 Dlg1.RES 文件。  

program Dialogs;

uses
  Windows, Messages, smallUtils;
{$R *.RES}
{$R Dlg1.RES}
var
  wClass: TWndClass;
  hForm1, hExitBut, hDlgBut, hCheckCB, hEdit1,
  hLabel1, Font1, hLabel2, hLabel3: THandle;
  mainMsg: TMSG;
  Rect1: TRect;
  DlgText, DlgEditText: String;
  DlgChk, Dlg2Chk: Boolean;

function DialogProc(hWnd,Msg,wParam,lParam:Longint):Boolean; stdcall;
{这里处理对话框消息。有些消息如 WndProc 消息(WM_COMMAND、WM_CLOSE)列
在这里,有些消息(WM_INITDIALOG)没有列出。在对话框 Proc 经常使用
 DlgItem ID 而不是 hWnd }
var
  OKrect:TRect;
begin
  Result := False;
  case Msg of
WM_INITDIALOG: begin
                 {WM_INITDIALOG 是设置你的 Dlg Items 属性的地方,有些特定的
                 DlgItem 函数(SendDlgItemMessage、SetDlgItemText)
                 对此比较有用。}
                 DlgEditText := '';
                 SendMessage(hWnd, WM_SETICON, 1, LoadIcon(hInstance,'Z1'));
                 {对话框默认使用图标,你需要设置图标}
                 SendDlgItemMessage(hWnd,200,WM_SETFONT,Font1, 0);
                 {SendDlgItemMessage 使用 ID 编号代替 hWnd}
                 CheckDlgButton(hWnd,100,BST_CHECKED);
                 if SendMessage(hCheckCB,BM_GETCHECK,0,0) = BST_CHECKED then
                 begin
                   {你可以从主窗体获取信息来设置对话框}
                   SetWindowText(GetDlgItem(hWnd,201),'多选按钮被勾选');
                   {这里可以使用 SetWindowText,但是一样可以使用 SetDlgItemText。
                   SetDlgItemText(hWnd,201,'检查框被勾选');}
                   EnableWindow(GetDlgItem(hWnd,101),False);
                   {大部分改变窗口的函数对于对话框一样有效}
                 end;
                 {SetWindowText(GetDlgItem(hWnd,202),PChar(DlgText));}
                 SetDlgItemText(hWnd,202,PChar(DlgText));
                 SetDlgItemText(hWnd,300,PChar(GetWindowStr(hEdit1)));
                 GetWindowRect(GetDlgItem(hWnd,IDOK),OKrect);
                 SetCursorPos(OKrect.Left+10,OKrect.Top+10);
               end;
WM_COMMAND: begin
              {和 MessageProc 的 WM_COMMAND 消息不一样,wParam 与 LParam
              有不同的用途。}
              if LOWORD(wParam) = IDOK then
              begin
                {对话框在 LOWORD(wParam) 使用 DlgItem ID}
                if (IsDlgButtonChecked(hWnd,101) = BST_CHECKED)
                then  Dlg2Chk := True;
                if (IsDlgButtonChecked(hWnd,100) = BST_CHECKED) then
                begin
                  MessageBox(hWnd,'对话框上多选按钮被勾选',
                    '退出对话框',MB_OK or MB_ICONQUESTION);
                  DlgChk := True;
                end;
                DlgEditText := GetWindowStr(GetDlgItem(hWnd,300));
                EndDialog(hWnd,1);
                Result := True;
              end
              else if LOWORD(wParam) = 401
                   then SetDlgItemText(hWnd,300, '新的编辑框文本')
                   else if LOWORD(wParam) = 101
                        then  MessageBox(hWnd,'对话框上多选按钮被单击',
                                  '单击它',MB_OK or MB_ICONQUESTION);
            end;
WM_CLOSE: begin
            {和 MessageProc 不一样,你需要使用 EndDialog 退出一个对话框}
            EndDialog(hWnd,1);
            Result := True;
          end;
  end;
end;

procedure DoDialog;
var
  Dsize: TdriveSize;
begin
  if hLabel3 <> 0 then
  begin
    DestroyWindow(hLabel3);
    while PeekMessage(mainMsg, 0, 0, 0, PM_REMOVE)
    do  DispatchMessage(mainMsg);
    hLabel3 := 0;
  end;
  Dsize := DiskSpace('C:\');
  DlgText := 'C 盘总容量为  '+Int2Str(Dsize.TotalS)+
           ' 字节 - 可用空间为  '+ Int2Str(Dsize.FreeS);
  {DlgText 被用于对话框的静态标签控件,你应该在调用 DialogBox( ) 前设置好对话框
  需要的所有的变量。}
  DialogBox(hInstance, 'First', hForm1, @DialogProc);
  {DialogBox 将根据资源 DIALOG 的 'First' 创建一个模式对话框,它以 hForm1 作为
  父窗体,以 DialogProc 作为 WndProc (MessageProc)}
  {可以从对话框获取返回值}
  if DlgChk then
  MessageBox(hForm1,'这里 DlgChk = True',
      '对话框返回值',MB_OK or MB_ICONQUESTION);
  if Dlg2Chk then
  begin
    hLabel3 := CreateWindow('Static', '"Check me" 多选按钮被勾选',
         WS_VISIBLE or WS_CHILD or SS_CENTER,6,200,370,29,hForm1,0,hInstance,nil);
    SendMessage(hLabel3, WM_SETFONT, Font1,0);
  end;
  SetWindowText(hLabel2,@DlgEditText[1]);
  DlgChk := False;
  Dlg2Chk := False;
end;

function MessageProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
begin
  case Msg of
    WM_COMMAND: if lParam = abs(hExitBut)
                then PostMessage(hForm1,WM_CLOSE,0,0)
                else if (LParam = abs(hDlgBut))
                     then DoDialog;
    WM_DESTROY: PostQuitMessage(0);
  end; // case 语句结束
  Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;

begin     // 主程序开始 //
  DlgChk := False;
  Dlg2Chk := False;
  hLabel3 := 0;

  Font1 := CreateFont(-16,0,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Arial');

  wClass.hInstance := hInstance;
  with wClass do
  begin
    style :=        CS_PARENTDC or CS_BYTEALIGNWINDOW;
    hIcon :=        LoadIcon(hInstance,'MAINICON');
    lpfnWndProc :=  @MessageProc;
    hbrBackground:= COLOR_BTNFACE+1;
    lpszClassName:= 'Form Class';
    hCursor :=      LoadCursor(0,IDC_ARROW);
  end;
  RegisterClass(wClass);

  SetRect(Rect1,0,0,430,300);
  if not AdjustWindowRect(Rect1,WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU,False)
  then SetRect(Rect1,0,0,438,328);

  hForm1 := CreateWindow(wClass.lpszClassName, '对话框演示程序',
    WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE,
    (GetSystemMetrics(SM_CXSCREEN) div 2)-200,
    (GetSystemMetrics(SM_CYSCREEN) div 2)-160,
    Rect1.Right-Rect1.Left, Rect1.Bottom-Rect1.Top,
    0, 0, hInstance, nil);

  hLabel1 := CreateWindow('Static', '对话框演示',
         WS_VISIBLE or WS_CHILD or SS_CENTER,8,8,388,22,hForm1,0,hInstance,nil);
  SendMessage(hLabel1,WM_SETFONT,Font1,0);

  hLabel2 := CreateWindow('Static',
         '在下面输入你想放置到对话框的文字'#10'对话框编辑框如数的文字将在此显示',
         WS_VISIBLE or WS_CHILD or SS_LEFT,10,38,290,28,hForm1,0,hInstance,nil);
  SendMessage(hLabel2,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);

  hExitBut := CreateWindow('Button','退 出',
    WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT,
    350,270,74,24, hForm1,0, hInstance,nil);

  hEdit1 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','这里输入的文字将显示在对话框中',
    WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL,
    16,78,410,21,hForm1,0,hInstance,nil);
  SendMessage(hEdit1,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);

  hDlgBut := CreateWindow('Button','显示对话框',
    WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT,
    30,160,144,24, hForm1,0, hInstance,nil);
  SendMessage(hDlgBut, WM_SETFONT, GetStockObject(ANSI_VAR_FONT),0);

  hCheckCB := CreateWindow('Button','对话框多选检测按钮',
    WS_CHILD or BS_AUTOCHECKBOX or WS_VISIBLE,
    20,130,190,24, hForm1,0,hInstance,nil);
  SendMessage(hCheckCB, WM_SETFONT, GetStockObject(ANSI_VAR_FONT),0);

  while GetMessage(mainMsg,0,0,0) do
  begin
    TranslateMessage(mainMsg);
    DispatchMessage(mainMsg);
  end;
  DeleteObject(Font1);
  DlgText := '';
  DlgEditText := '';
end.

 

在对话框中包含常规控件
  为了在对话框里创建预定义的控件类,可以使用如下的一般语法,参数为:

ClassName text, IDnumber, x, y, width, height , style , extended-style
 X 和 width 是水平方向单位,是对话框基本宽度单位的 1/4 ,Y 和 height 是竖直方向单位,是对话框基本高度单位的 1 /8 。当前对话框基本单位是计算机从当前系统字体的高度和宽度得到的,GetDialogBaseUnits( ) 函数可以返回对话框基本单位的对应 像素值。

ControlName - 预定义的控件的类名,比如 BUTTON、 COMBOBOX、 EDIT、 LISTBOX、 SCROLLBAR、 STATIC 等。

text - 指 定控件上显示的文本。文本位置在控件指定尺寸之内或者接近控件。这个参数是有双引号(")括起来的 0 到多个字符。字符串自动以零结束并在资源文件返回 结果中转换成 Unicode 字符。默认情况下,双引号括起的字符是 ANSI 字符,交换码顺序被认为是按位交换码顺序。如果字符串加上 L 前缀, 字符串被认为是宽字符组成,交换码顺序被认为是两位交换码,这就是 Unicode 字符。如果双引号本身在文本内,那么需要连续使用双引号两次。 And 符号(&)放在文本中表示后面跟着的字符是控件的助记符(加速字符),当控件显示的时候,& 不会出现,后面的字符会自动加上下 划线显示,用户可以通过按下下划线助记符来选择这个控件。为了在字符串中使用 & 字符,你需要连续两次使用(&&)。

IDnumber - 指定控件标识。这个值为 Word 类型,介于 0 到 65,535 之间。

x - 给出控件在对话框客户区域左边距,这个值为 Word 类型,介于 0 到 65,535 之间。这个坐标轴在对话框的客户区域的左边缘为 0 对话框单位。

y - 给出控件在对话框客户区域上边距,这个值为 Word 类型,介于 0 到 65,535 之间。这个坐标轴在对话框的客户区域的上边缘为 0 对话框单位。

width - 指 定控件宽度,这个值为 Word 类型,介于 1 到 65,535 之间。宽度单位为 1/4 字符。 Specifies the width of the control. This value must be a Word value in the range 1 through 65,535. The width is in 1/4-character units. 
height - 指定控件高度,这个值为 Word 类型,介于 1 到 65,535 之间。宽度单位为 1/8 字符。 

style - 指定控件的风格。利用逻辑或操作( | )组合多个风格。 

extended-style - 指定扩展风格(WS_EX_xxx)。你必须给定一种风格以便使用扩展风格

posted @ 2008-10-03 21:55 micheal's tech 阅读(1908) | 评论 (0)编辑 收藏

     摘要: 【精华】网络socket编程指南 http://www.chinaunix.net 作者:流浪者  发表于:2008-04-20 15:21:55 ...  阅读全文

posted @ 2008-10-03 16:19 micheal's tech 阅读(111) | 评论 (0)编辑 收藏

http://www.microsoft.com/china/msdn/developercenter/mobility/blog/WTLstart.mspx

posted @ 2008-09-16 13:22 micheal's tech 阅读(249) | 评论 (0)编辑 收藏

将关键字转化为表地址的函数称为散列函数。理想的散列函数易于转换并且是随机的,这里的随机是指对每一个输入,相应的输出在某种程度上是等概率的。
常用的散列函数,适用于整数,模散列函数:k mod(M)
适用于关键字为字符串的算法:霍纳算法。
散列最主要的优越性能在于能够提供近似于常数的时间。

posted @ 2008-08-18 11:26 micheal's tech 阅读(376) | 评论 (0)编辑 收藏

include: concurrency transaction recovery .
concurrency  means that multiple users can operate on the database at the same time.
transaction    permit users to make multiple changes appear at once.
                    ACID: atomicity consistency isolation durability
recovery       surviving application and system crashes.

posted @ 2008-08-13 11:14 micheal's tech 阅读(91) | 评论 (0)编辑 收藏

懒懒的不想动,总要找点什么做吧。

posted @ 2008-08-05 15:22 micheal's tech 阅读(74) | 评论 (0)编辑 收藏

同步、异步、阻塞和非阻塞的概念【zz】


同步、异步、阻塞和非阻塞的概念

在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。
同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。
异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。这里提到执行 部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部 件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重 的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同 步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数 据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操 作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
对象的阻塞模式和阻塞函数调用
对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状 态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。

阻塞通信

--------------------------------------------------------------------------------

通过重叠通信和计算在许多系统能提高性能。由一个智能通信控制器自动地执行通信的系统是真实的。轻-重线索是取得这种重叠的一种机制。导致好性能的 一个可选的机制是使用非阻塞通信。一个阻塞发送开始调用初始化这个发送操作,但不完成它。在这个消息被从这个发送缓存拷出以前,这个发送开始调用将返回。 需要一个独立的“发送完成”调用完成这个通信,例如,检验从发送缓存拷出的数据。用适当的硬件,在发送被初始化后和它完成以前,来自发送者存储的数据转换 可以和在发送者完成的计算同时进行。类似地,一个非阻塞“接收开始调用”初始化这个接收操作, 但不完成它。在一个消息被存入这个接收缓存以前,这个调用将返回。须要一个独立的“接收完成”调用完成这个接收操作,并检验被接收到这个接收缓存的数据。 用适当的硬件,在接收操作初始化后和它完成以前,到接收者存储的数据转换可以和计算同时进行。非阻塞接收的使用虽着信息较早地在接收缓存位置被提供,也可 以避免系统缓存和存储器到存储器拷贝。

非阻塞发送开始调用能使用与阻塞发送一样的四种模式: 标准, 缓存, 同步和准备好模式。这些具有同样的意义。无论一个匹配接收是否已登入,能开始除“准备好”以外的所有模式的发送;只要一个匹配接收已登入,就能开始一个非 阻塞“准备好”发送。在所有情况下,发送开始调用是局部的:无论其它进程的状态如何,它立刻返回。如果这个调用使得一些系统资源用完,那么它将失败并返回 一个错误代码。高质量的MPI实现应保证这种情况只在“病态”时发生。即,一个MPI实现将能支持大数量挂起非阻塞操作。  

当数据已被从发送缓存拷出时,这个发送完成调用返回。它可以带有附加的意义,这取决于发送模式。  

如果发送模式是“同步的”,那么只有一个匹配接收已开始这个发送才能完成。即,一个接收已被登入,并已和这个发送匹配。这时,这个发送完成调用是非 局部的。注意,在接收完成调用发生以前,如果一个同步、非阻塞发送和一个非阻塞接收匹配, 它可以完成。(发送者一“知道”转换将结束,它就能完成,但在接收者“知道”转换将结束以前)。  

如果发送模式是“缓存”,并没有挂起接收,那么消息必须被缓存。这时,发送完成调用是局部的,而且无论一个匹配接收的状态如何,它必须成功。  

如果发送模式是标准的,同时这个消息被缓存,那么在一个匹配接收发生以前,发送结束调用可以返回。另一方面,发送完成直到一个匹配接收发生才可以完成,并且这个消息已被拷到接收缓存。  

非阻塞发送能被用阻塞接收匹配,反过来也可以。   

给用户的建议. 一个发送操作的完成, 对于标准模式可以被延迟, 对于同部模式必须延迟, 直到一个匹配接收登入。这两种情况下非阻塞发送的使用允许发送者提前于接收者进行,以便在两进程的速度方面,计算更容忍波动。  

缓存和准备好模式中的非阻塞发送有一个更有限的影响。一可能一个非阻塞发送将返回,而一个阻塞发送将在数据被从发送者存储拷出后返回。只要在数据拷贝能和计算同时的情况下,非阻塞发送的使用有优点。  

消息发送模式隐含着由发送者初始化通信。当发送者初始化通信(数据被直接移到接收缓存, 并不要求排队一个挂起发送请求) 时,如果一个接收已登入,这个通信一般将有较低的额外负担。但是,只在匹配发送已发生后,一个接收操作能完成。当非阻塞接收等待发送时,没有阻塞接收,它 的使用允许得到较低的通信额外负担。(给用户的建议结束)。


posted @ 2008-07-30 14:57 micheal's tech 阅读(153) | 评论 (0)编辑 收藏

socket作为系统内部的IPC程序实例,可以用来作为内部进程的通信。
socket 的优势在于能够处理多个client进程访问一个server进程的情况。
利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中.
共享内存对于数据量比较大的IpC通信是比较有用的。下面会找一个例子来说明IPC通信。

posted @ 2008-07-30 12:00 micheal's tech 阅读(262) | 评论 (0)编辑 收藏

仅列出标题
共8页: 1 2 3 4 5 6 7 8