⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tlsstat.dpr

📁 一本已经绝版的好书
💻 DPR
字号:

// Module name: TLSStat.C ->> TLSStat.dpr
// Notices: Copyright (c) 1995-1997 Jeffrey Richter
// Translator: 刘麻子, Liu_mazi@126.com

program TLSStat;

{$R 'TLSStat.res' 'TLSStat.rc'}

uses
  Windows, Messages,
  Other in '..\Other.pas', CmnHdr in '..\CmnHdr.pas', WindowsX in '..\WindowsX.pas';

const
  g_szModName = 'TLSStat';
  IDD_TLSSTAT    =  1;
  IDC_CLEAR      =  100;
  IDC_THREADNUM  =  101;
  IDI_TLSSTAT    =  101;
  IDC_NUMCYCLES  =  102;
  IDC_CYCLETIME  =  103;
  IDC_LOG        =  104;

  // 线程参数
type
  PThreadData = ^TThreadData;
  TThreadData = record
    nThreadNum: Integer;  // 线程编号
    nNumCycles: Integer;  // 循环次数
    dwCycleTime: DWORD;   // 挂起时间
  end;

  // ListBox
var
  g_hWndLogLB: HWND = 0;

  // TLS变量
threadvar
  gt_dwStartTime: DWORD;

  // 线程函数
function ThreadFunc(var lpThreadData: TThreadData): Integer;
var
  szBuf: array[0..100] of Char;
begin
  // 开始时间
  gt_dwStartTime := GetTickCount();

  // 显示开始
  _wvsprintf(szBuf, 'Thread started: %d', [lpThreadData.nThreadNum]);
  ListBox_AddString(g_hWndLogLB, szBuf);
  ListBox_SetCurSel(g_hWndLogLB, 0);

  // 循环工作
  while (lpThreadData.nNumCycles > 0) do
  begin
    Dec(lpThreadData.nNumCycles);

    // 显示状态
    _wvsprintf(szBuf, 'Thread %d, Cycles left=%d, time running=%d',
      [lpThreadData.nThreadNum, lpThreadData.nNumCycles, GetTickCount() - gt_dwStartTime]);
    ListBox_AddString(g_hWndLogLB, szBuf);

    // 挂起一会
    Sleep(lpThreadData.dwCycleTime);
  end;

  // 显示结束
  _wvsprintf(szBuf, 'Thread ended: %d, total time=%d',
    [lpThreadData.nThreadNum, GetTickCount() - gt_dwStartTime]);
  ListBox_AddString(g_hWndLogLB, szBuf);

  // 释放结构
  HeapFree(GetProcessHeap(), 0, @lpThreadData);

  Result := 0;
end;

  // WM_INITDIALOG
function Dlg_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
begin
  chSETDLGICONS(hWnd, IDI_TLSSTAT, IDI_TLSSTAT);

  SetDlgItemInt(hWnd, IDC_THREADNUM, 1, FALSE);
  SetDlgItemInt(hWnd, IDC_NUMCYCLES, 10, FALSE);
  SetDlgItemInt(hWnd, IDC_CYCLETIME, 3, FALSE);

  g_hWndLogLB := GetDlgItem(hWnd, IDC_LOG);

  SetFocus(GetDlgItem(hWnd, IDOK));
  Result := TRUE;
end;

  // WM_COMMAND
procedure Dlg_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
var
  dwIDThread: DWORD;
  hThread: THandle;
  lpThreadData: PThreadData;
begin
  case (id) of
    IDC_CLEAR:
      begin
        SetDlgItemInt(hWnd, IDC_THREADNUM, 1, FALSE);
        ListBox_ResetContent(g_hWndLogLB);
      end;

    IDOK:
      begin
        // 分配结构
        lpThreadData := HeapAlloc(GetProcessHeap(), 0, SizeOf(TThreadData));
        if (lpThreadData = nil) then
        begin
          chMB('Error creating ThreadData', g_szModName);
          Exit;
        end;

        // 填写结构
        lpThreadData.nThreadNum := GetDlgItemInt(hWnd, IDC_THREADNUM, PBOOL(nil)^, FALSE);
        lpThreadData.nNumCycles := GetDlgItemInt(hWnd, IDC_NUMCYCLES, PBOOL(nil)^, FALSE);
        lpThreadData.dwCycleTime := 1000 * GetDlgItemInt(hWnd, IDC_CYCLETIME, PBOOL(nil)^, FALSE);

        // 编号增加
        SetDlgItemInt(hWnd, IDC_THREADNUM, lpThreadData.nThreadNum + 1, FALSE);

        // 建立线程
        hThread := BeginThread(nil, 0, @ThreadFunc, lpThreadData, 0, dwIDThread);

        // 释放资源
        if (hThread <> 0) then
        begin
          CloseHandle(hThread);
        end else
        begin
          chMB('Error creating the new thread', g_szModName);
          HeapFree(GetProcessHeap(), 0, lpThreadData);
        end;
      end;

    IDCANCEL:
      begin
        EndDialog(hWnd, id);
      end;
  end;
end;

  // 对话框回调
function Dlg_Proc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
  case (uMsg) of
    WM_INITDIALOG:
      Result := SetDlgMsgResult(hWnd, LRESULT(Dlg_OnInitDialog(hWnd, wParam, lParam)));

    WM_COMMAND:
    begin
      Dlg_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
      Result := TRUE;
    end;

    else Result := FALSE;
  end;
end;

  // 主线程入口
var
  szBuf: array[0..100] of Char;
begin
  // 记录开始时间
  gt_dwStartTime := GetTickCount();

  chWARNIFUNICODEUNDERWIN95();
  DialogBox(HInstance, MakeIntResource(IDD_TLSSTAT), 0, @Dlg_Proc);

  // 显示运行时间
  _wvsprintf(szBuf, 'Total time running application=%d.', [GetTickCount() - gt_dwStartTime]);
  chMB(szBuf, g_szModName);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -