Изучение организации мультипрограммирования в ОС Windows: Методические рекомендации по выполнению лабораторной работы, страница 4

13.  Сформулируйте назначение и объясните параметры функции CreateThread().

14.  Когда следует использовать функцию CreateThread()?

15.  Какие функции используются для завершения потока?

16.  Составьте и выполните программу  с использованием функции CreateThread().

5.  ЛИТЕРАТУРА

1.  Сетевые операционные системы / В.Г.  Олифер, Н.А. Олифер. – СПб.: Питер, 2001,

      стр. 87 – 140.

2.  Румянцев П.В. Азбука программирования в Win32  API. -  М.: Радио и связь  - Телеком, 1999,  стр. 217 – 237.

3.  Вильямс А. Системное программирование в Windows 2000 для профессиналов. – СПб.: Питер, 2001, стр. 147 – 168.

 Приложение 1.

// Программа,демонстрирующая использование функций

// Win32 API -  WinExec() и  ShellExecute().

// С помощью функции WinExec()программа открывает блокнот Notepad

// с загрузкой текстового файла в блокнот.

// С помощью функции ShellExecute()программа запускает

// проводник Windows, файл explorer.exe.

// Тип приложения Win32, Console

  #include <windows.h>

  #include <iostream.h>

void  main(int argc, char *argv[])

 {

   cout << "Use  WinExec\n";

   // Открываем файл support.txt с помощью блокнота notepad.exe

   if (WinExec("notepad c:\\windows\\support.txt", SW_SHOW)<32)

   MessageBox(NULL, "Ошибка запуска WinExec", NULL,MB_OK);//Если ошибка

   cout<<"Press  Enter\n";

   MessageBox(NULL, "Для продолжения нажмите OK",

            "Программа запущена!",MB_OK);

   cout<<"Use function ShellExecute";

   //  Запуск Explorer.exe с помощью ShellExecute()

   if (ShellExecute(NULL,"open","c:\\windows\\explorer.exe",NULL,

                              NULL, SW_SHOW)<(HANDLE)32)

      MessageBox(NULL, "Ошибка запуска ShellExecute", NULL,MB_OK);

 }

 Приложение 2

//демонстрационная программа создания и уничтожения процессов

//тип приложения Win32, GUI

#include <windows.h>

#include <stdio.h>

#include "proc.h"

LRESULT CALLBACK ProcessesWndProc(HWND,UINT,UINT,LONG);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

               LPSTR lpszCmdParam, int nCmdShow )

 {

   HWND hWnd;

   WNDCLASS WndClass;

   MSG Msg;

   char szClassName[]="Processes";

   /*Регистрация класса окна*/

   WndClass.style = CS_HREDRAW|CS_VREDRAW;

   WndClass.lpfnWndProc = ProcessesWndProc;

   WndClass.cbClsExtra = 0;

   WndClass.cbWndExtra = 0;

   WndClass.hInstance=hInstance;

   WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

   WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

   WndClass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);

   WndClass.lpszMenuName = "ProcessesMenu";

   WndClass.lpszClassName = szClassName;

   if(!RegisterClass(&WndClass))

    {

     MessageBox(NULL, "Ошибка регистрации класса", "Ошибка!", MB_OK);

     return 0;

    }

   hWnd = CreateWindow(szClassName,"Program No 1",

                      WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,

                       CW_USEDEFAULT, CW_USEDEFAULT,

                       CW_USEDEFAULT, CW_USEDEFAULT,

                       NULL, NULL,

                       hInstance, NULL);

  if(!hWnd)

  {

    MessageBox(NULL, "Ошибка создания окна", "Ошибка!",MB_OK);

    return 0;

  }

  //Отображение окна

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  //Начало цикла обработки сообщений

  while(GetMessage(&Msg, NULL,0,0))

  {

    TranslateMessage(&Msg);

    DispatchMessage(&Msg);

  }

 return Msg.wParam;

 }

 LRESULT CALLBACK ProcessesWndProc(HWND hWnd, UINT Message,

                               UINT wParam,LONG lParam)

  {

    const Max = 10;

    STARTUPINFO StartupInfo;

    static int ProcessNumber=0;

    static int ProcessInfo;

    static PROCESS_INFORMATION ProcessInformation[Max];

    static char cMyMessage[80];

    static HMENU hSubMenu;

    UINT  uExitCode;

    switch(Message)

    {

        case WM_CREATE:

         hSubMenu=GetSubMenu(GetMenu(hWnd),0);

         return     0;

        case WM_COMMAND:

       switch(LOWORD(wParam))

        {

         case IDM_New_Process:

          if(ProcessNumber<Max)

           {

            StartupInfo.cb=sizeof(STARTUPINFO);

            StartupInfo.lpReserved=NULL;

            StartupInfo.lpDesktop=NULL;

            StartupInfo.lpTitle=NULL;

            StartupInfo.dwFlags=STARTF_USESHOWWINDOW;

            StartupInfo.wShowWindow=SW_SHOWNORMAL;

            StartupInfo.cbReserved2=0;

            StartupInfo.lpReserved=NULL;

            if(CreateProcess(NULL,"Notepad.exe",NULL,NULL,

                             FALSE,0,NULL,NULL, &StartupInfo,

                             &(ProcessInformation[ProcessNumber])))

             {

              ProcessNumber++;

              wsprintf(cMyMessage,

               "hProcess is %x,\n hThread is %x,\n dwProcessId is %x,\n \

               dwThreadId is %x",

               ProcessInformation[ProcessNumber-1].hProcess,

               ProcessInformation[ProcessNumber-1].hThread,

               ProcessInformation[ProcessNumber-1].dwProcessId,

               ProcessInformation[ProcessNumber-1].dwThreadId);

               MessageBox(hWnd,cMyMessage,"Процесс создан!",MB_OK);

               EnableMenuItem(hSubMenu,IDM_Kill_Process,