Приложение WINTEST
Приложение wintest.c, показывающее работу ввода-вывода (см. листинг 5), состоит главным образом из немодульного диалогового блока, в котором непрерывно высвечивается количество прерываний, обработанных с начала работы программы.
Программа MainDlgProc вызывает программу BogusStart во время выполнения WM_INITDIALOG, передавая в качестве параметра обработчик окна диалогового блока. Программа ISR регистрирует сообщения к данному обработчику в тех случаях, когда счетчик прерываний изменяется от нуля к единице.
Программа MainDlgProc сохраняет текущее суммарное значение счетчика в переменной wCountTotal. Всякий раз, когда диалог получает сообщение WM_COMMAND с параметром wParam, равным IDM_BOGUSEVENT, программа обновляет суммарный счетчик, отображаемый в диалоговом блоке. Следует отметить, что хотя программа ISR регистрирует сообщение только тогда, когда счетчик изменяется от нуля к единице, возможна (и весьма вероятно) обработка количества прерываний до того, как сообщение WM_COMMAND фактически будет передано диалоговой процедуре. Методика, показанная в данной программе, при которой программа ISR регистрирует сообщение только при первом переходе, а программа BogusCheck чистит счетчик, обеспечивает точный подсчет количества прерываний, даже если на уровне приложения нельзя учесть каждое прерывание в момент его возникновения.
При выполнении данной программы можно наблюдать, что счетчик прерывания в диалоговом блоке непрерывно увеличивается, указывая количество выполненных операций ввод-вывода.
_____________________________________________________________________
#include
#include "bogus.h"
#include "wintest.h"
HANDLE hPgmInstance ;
#define IDM_BOGUSEVENT 0x3000
void CenterWindow(HWND hWnd)
{
int xSize, ySixe, xPos, yPos ;
RECT rc ;
xSize = GetSystemMetrics(SM_CXSCREEN) ;
аааа ySize = GetSystemMetrics(SM_CYSCREEN) ;
аааа GetWindowRect(hWnd, &rc) ;
аааа xPos = (xSize - (rc.right - rc.left)) / 2 ;
аааа yPos = (ySize - (rc.bottom - rc.top)) / 2 ;
аааа SetWindowRect(hWnd, NULL, xPos, yPos, 0, 0,
аааааааа SWP_DRAWFRAME | SWP_NOSIZE | SWP_NOZORDER) ;
аааа }
LRESULT _loadds FAR PASCAL MainDlgProc(HWND hwndDlg,
UINT msg, WPARAM wParam, LPARAM lParam)
{
аааа static WORD wCountTotal = 0;
аааа WORD wCount ;
аааа lParam = lParam ;
аааа switch (msg)
аааа {
аааа case WM_INITDIALOG:
ааааааааа RemoveMenu(GetSystemMenu(hwndDlg,0),
SC_CLOSE,MF_BYCOMMAND) ;
ааааааааа BogusStart(hwndDlg, IDM_BOGUSEVENT) ;
ааааааааа break ;
аааа case WM_SHOWWINDOW:
ааааааааа if (wParam)
ааааааааа CenterWindow(hwndDlg) ;
ааааааааа break ;
аааа case WM_COMMAND:
ааааааааа switch (wParam)
ааааааааа {
ааааааааа case IDM_BOGUSEVENT:
аааааааааааааа wCount = BogusGetEvent() ;
аааааааааааааа while 9wCount)
аааааааааааааа {
аааааааааааааа wCountTotal += wCount ;
аааааааааааааа wCount = BogusGetEvent() ;
аааааааааааааа }
аааааааааааааа SetDlgItemInt(hwndDlg, IDM_COUNT, wCountTotal, FALSE);
аааааааааааааа break ;
ааааааааа case IDCANCEL:
аааааааааааааа EndDialog(hwndDlg, 0) ;
аааааааааааааа break ;
ааааааааа }
ааааааааа break ;
аааа default:
ааааааааа return FALSE ;
аааа }
аааа return TRUE ;
}
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpCmdLine, intnCmdShow)
{
аааа hPgmInstance = hInstance ;
аааа hPrevInstance = hPrevInstance ;
аааа lpCmdLine = lpCmdLine ;
аааа nCmdShow = nCmdShow ;
аааа if (!hPrevInstance)
аааа {
аааа if (BogusCheck())
ааааааааа {
ааааааааа if (MessageBox(0, "Press OK to begin bogus I/O",
аааааааааааааааааа "WinTest", MB_OKCANCEL|MB_APPLMODAL) == IDOK)
ааааааааа {
ааааааааа DialogBox(hPgmInstance, "MainDlg", 0,
аааааааааааааааааа (FARPROC) MainDlgProc) ;
ааааааааа BogusStop() ;
ааааааааа }
ааааааааа }
аааа else
ааааааааа MessageBox(0, "Bogus device not found", "WinTest",
MB_ICOMMAND|MB_OK|MB_APPLMODAL) ;
аааа }
аааа else
аааа MessageBox(0, "Another instance already running",
аа "WinTest", MB_ICONEXCLAMATION|MB_OK|MB_APPLMODAL) ;
аааа return 0 ;
}
______________________________________________________________________
а аааTшёЄшэу 5. ¦ЁюуЁрььр wintest.c.