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

                                MF_BYCOMMAND|MF_ENABLED);

            }

           else

            MessageBox(hWnd,"Ошибка создания процесса", "Информация",

                       MB_OK);

            }

             else

              {

               MessageBox(hWnd,"Слишком много созданных процессов...",

                            "Внимание!", MB_OK);

              }

            break;

         case IDM_Kill_Process:

          if(ProcessNumber>0)

           {

if(TerminateProcess(ProcessInformation[ProcessNumber-1].hProcess,0))

             {

              ProcessNumber--;

              if(!ProcessNumber)

               EnableMenuItem(hSubMenu,IDM_Kill_Process,

                              MF_BYCOMMAND|MF_GRAYED);

             }

            else

              MessageBox(hWnd,"Ошибка завершения процесса",

                                            "Информация", MB_OK);

            }

          else

               MessageBox(hWnd,"Процессов больше нет",

                          "Информация", MB_OK);

            break;

         case IDM_Exit:

            SendMessage(hWnd, WM_CLOSE,0,0);

            break;

            }

            return 0;

         case WM_DESTROY:

           PostQuitMessage(0);

           return 0;

      }

   return DefWindowProc(hWnd,Message,wParam,lParam);

 }

файл описаний   proc.h

#define     IDM_EXIT          103

#define     IDM_Kill_Process  102

#define     IDM_New_Process   101

файл ресурсов crprocess.rc

ProcessesMenu MENU

{

 POPUP "&Processes"

 {

  MENUITEM "&New process", 101

  MENUITEM "&Kill process", 102

  MENUITEM SEPARATOR

  MENUITEM "E&xit", 103

 }

}          

Приложение 3

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

// CreateThread( ) Win32 API

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

#include <stdio.h>

#include <iostream.h>

#include <windows.h>

#include <time.h>

// Функция, выполняющаяся в созданном потоке,

//выводит номер потока и текущую дату и  время

DWORD WINAPI  thread_code(LPVOID threadno)

{

  static int k;

  time_t   t;

  time(&t);

  cout<<"\n"<< " Executing thread # "<<++k<<"  time = "<<ctime(&t);

  ExitThread(2);

}

// Функция создания и запуска потока

DWORD start_thread(int j)

{

 unsigned long  ThreadId;

 HANDLE hThread;

 hThread = CreateThread(NULL,0,thread_code,0,0,&ThreadId);

 if (hThread == NULL)  {

   printf("\n Error creating thread # %d ", j);

   return 3;

 }

 cout<<"\n"<<" Created thread # "<< j <<"  ID= "<< ThreadId;

 return 1;

}

int main(void)

{

  int i;

  for (i=1; i<6; i++)  start_thread(i);

  cout<<"\n"<< " Press ENTER to exit main thread "<<"\n";

  getchar();

  return 0;

}

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

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

//стандартной библиотеки С++ __beginthread()

// заголовочный файл функции process.h

#include <stdio.h>

#include <errno.h>

#include <stddef.h>     /* _threadid variable */

#include <process.h>    /* _beginthread, _endthread */

#include <time.h>       /* time, _ctime */

//Функция, выполняющаяся в отдельном потоке, выводит номер и время потока

void thread_code(void *threadno)

{

  time_t t;

  time(&t);

  printf("Executing thread number %d,  time = %s\n",

        (int)threadno,  ctime(&t));

  _endthread(); //Завершение потока

}

//Функция создания потока

void start_thread(int i)

{

  int thread_id;

 if ((thread_id = _beginthread(thread_code,4096,(void *)i)) ==
    (unsigned long)-1)

  {

    printf("Unable to create thread %d, errno = %d\n",i,errno);

    return;

  }

  // вывод идентификатора потока

  printf("Created thread %d, ID = %ld\n", i, thread_id);

}

int main(void)

{

  int i;

// Создание новых потоков в цикле

  for (i = 1; i < 6; i++) start_thread(i);

  printf("\n Press  ENTER to exit main thread.\n");

  getchar();

  return 0;

}

Приложение 5

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

    // в консольном приложении

#include <windows.h>

#include <iostream.h>

void  main()

{

   // передача указателя на пустую структуру о запуске процесса STARTUPINFO

   STARTUPINFO info;

   memset(&info, 0, sizeof(info));

   info.cb = sizeof(info);

   // Объявление структуры для дескрипторов и идентификаторов

   // нового процесса и потока

   PROCESS_INFORMATION pinfo;

   //            Запускаем программу notepad.exe

   if(!CreateProcess(NULL,"c:\\Windows\\Notepad.exe" , NULL, NULL,

                             FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL,

                             &info, &(pinfo)))

      //Если ошибка создания процесса

     { cout << "CreateThread(..) failed, error code is "

             << GetLastError() << endl;

       MessageBox(NULL, "Ошибка создания процесса ", "Информация!",MB_OK);

      return;

     }                      

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

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

}