• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            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 閱讀(405) | 評論 (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.shnenglu.com/michaelgao/archive/2008/10/03/63200.html





            posted @ 2008-10-03 21:59 micheal's tech 閱讀(1965) | 評論 (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 閱讀(1924) | 評論 (0)編輯 收藏

                 摘要: 【精華】網絡socket編程指南 http://www.chinaunix.net 作者:流浪者  發表于:2008-04-20 15:21:55 ...  閱讀全文

            posted @ 2008-10-03 16:19 micheal's tech 閱讀(116) | 評論 (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 閱讀(384) | 評論 (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 閱讀(76) | 評論 (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 閱讀(265) | 評論 (0)編輯 收藏

            僅列出標題
            共8頁: 1 2 3 4 5 6 7 8 
            久久se精品一区精品二区国产| 99久久综合国产精品二区| 久久亚洲国产成人影院网站 | 久久99国产乱子伦精品免费| 久久久无码精品亚洲日韩蜜臀浪潮| 精品无码久久久久国产| 亚洲国产精品久久| 狠狠色狠狠色综合久久| 国产精品久久久久久| 亚洲婷婷国产精品电影人久久| 色欲久久久天天天综合网精品 | 精品久久久久久久无码| 久久国产成人精品国产成人亚洲| 97视频久久久| 国产ww久久久久久久久久| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久亚洲精品蜜桃臀| 久久狠狠色狠狠色综合| 99精品国产免费久久久久久下载| 91久久香蕉国产熟女线看| 久久久国产乱子伦精品作者| 免费一级欧美大片久久网| 久久精品嫩草影院| www久久久天天com| 东方aⅴ免费观看久久av| 久久夜色精品国产| 国产午夜福利精品久久| 久久精品视频网| 久久精品国产亚洲欧美| av国内精品久久久久影院| 国产精品免费看久久久| 久久综合给合久久狠狠狠97色| 精品人妻伦九区久久AAA片69 | 国产精品一区二区久久国产| 中文无码久久精品| 中文字幕无码免费久久| 狠狠色婷婷久久一区二区| 婷婷伊人久久大香线蕉AV | 91精品国产高清久久久久久io | 久久久久国产精品人妻| 久久久久久精品成人免费图片|