?? handshake.dpr
字號:
program Handshake;
{$R 'Handshake.res' 'Handshake.rc'}
uses
Windows, Messages;
const
IDD_HANDSHAKE = 101; // 模板資源ID
IDI_HANDSHAKE = 102; // 圖標資源ID
IDC_REQUEST = 1000; // 子控件ID..
IDC_RESULT = 1001;
IDC_SUBMIT = 1002;
g_szServerShutdown = 'Server Shutdown'; // (服務線程)結束標識
var
g_hevtRequestSubmitted: THandle; // 服務線程等待客戶線程請求(事件對象)
g_hevtResultReturned: THandle; // 客戶線程等待服務線程返回(事件對象)
g_szSharedRequestAndResultBuffer: array[0..1024] of Char; // (線程間)共享內存塊
// 反轉字符串
procedure ReverseString(S: PChar);
var
T: Char;
E: PChar;
begin
E := S;
while (E^ <> #0) do Inc(E);
Dec(E);
while (S < E) do
begin
T := S^;
S^ := E^;
E^ := T;
Dec(E);
Inc(S);
end;
end;
// 服務線程回調
function ServerThread(pvParam: Pointer): Integer;
var
fShutdown: BOOL;
begin
fShutdown := FALSE;
while (fShutdown = FALSE) do
begin
// 等待提交請求
WaitForSingleObject(g_hevtRequestSubmitted, INFINITE);
// 是否結束標識
fShutdown := (lstrcmpi(g_szSharedRequestAndResultBuffer, g_szServerShutdown) = 0);
// 處理反轉請求
if (fShutdown = FALSE) then ReverseString(g_szSharedRequestAndResultBuffer);
// 返回客戶線程
SetEvent(g_hevtResultReturned);
end;
Result := 0;
end;
// 對話框WM_INITDIALOG處理
function Dlg_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
begin
// 設置窗口圖標
SendMessage(hWnd, WM_SETICON, ICON_BIG, LoadIcon(HInstance, MakeIntResource(IDI_HANDSHAKE)));
SendMessage(hWnd, WM_SETICON, ICON_SMALL, LoadIcon(HInstance, MakeIntResource(IDI_HANDSHAKE)));
// 設置控件文字
SetWindowText(GetDlgItem(hWnd, IDC_REQUEST), 'Some test data');
// 接受默認焦點
Result := TRUE;
end;
// 對話框WM_COMMAND處理
procedure Dlg_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
begin
case (id) of
IDCANCEL: // 要求關閉
begin
EndDialog(hWnd, id);
end;
IDC_SUBMIT: // 按鈕
begin
// 讀入待處理字符串
GetWindowText(GetDlgItem(hWnd, IDC_REQUEST), g_szSharedRequestAndResultBuffer, 1024);
// 通知服務線程處理
SetEvent(g_hevtRequestSubmitted);
// 掛起等待處理完畢
WaitForSingleObject(g_hevtResultReturned, INFINITE);
// 顯示已處理字符串
SetWindowText(GetDlgItem(hWnd, IDC_RESULT), g_szSharedRequestAndResultBuffer);
end;
end;
end;
// 對話框消息回調
function Dlg_Proc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
Result := FALSE;
case (uMsg) of
WM_INITDIALOG:
Result := SetWindowLong(hWnd, DWL_MSGRESULT, Longint(Dlg_OnInitDialog(hWnd, wParam, lParam))) <> 0;
WM_COMMAND:
Dlg_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
end;
end;
// 主線程(客戶線程)入口
var
dwThreadID: DWORD;
hThreadServer: THandle;
h: array[0..1] of THandle;
begin
// 建立兩個自動重置事件對象并預置為'未通知'狀態
g_hevtRequestSubmitted := CreateEvent(nil, FALSE, FALSE, nil);
g_hevtResultReturned := CreateEvent(nil, FALSE, FALSE, nil);
// 建立一個服務線程
hThreadServer := BeginThread(nil, 0, @ServerThread, nil, 0, dwThreadID);
// 顯示客戶線程界面
DialogBox(HInstance, MakeIntResource(IDD_HANDSHAKE), 0, @Dlg_Proc);
// 通知服務線程結束
lstrcpy(g_szSharedRequestAndResultBuffer, g_szServerShutdown);
SetEvent(g_hevtRequestSubmitted);
// 等待服務線程結束
h[0] := g_hevtResultReturned;
h[1] := hThreadServer;
WaitForMultipleObjects(2, @h[0], TRUE, INFINITE);
// 關閉內核對象句柄
CloseHandle(hThreadServer);
CloseHandle(g_hevtRequestSubmitted);
CloseHandle(g_hevtResultReturned);
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -