Процессы, потоки и нити в ОС Windows

Страницы работы

Содержание работы

Министерство образования  и науки Российской Федерации

Федеральное агенство по образованию

Государственное образовательное учреждение
высшего профессионального образования

«Комсомольский-на-Амуре государственный технический университет»

Факультет Компьютерных технологий

Кафедра математического обеспечения и применения ЭВМ

Лабораторная работа №4

По курсу «ОСЗР»

Выполнил:                                                                                                                                              Рогозин В.А.

Проверил:                                                                                                                                               Тихомиров В.А.

Вариант:                                                                                                                                                                           16

Комсомольск-на-Амуре

2007

Тема:               Процессы, потоки и нити в ОС Windows.

Цель:               Изучить теоретические вопросы  управления потоками в ОС Windows и освоить приемы практической реализации этого управления с использованием системных функций.

Задание:1) Внимательно изучить теоретический материал;

2) Набрать и проверить работоспособность программных модулей, представленных на листингах 1-7. Тексты программ вместе с результатами их тестирования вставить в отчет;

3) Выполнить индивидуальное задание в соответствии с выданным преподавателем вариантом:

Программа создает три потока и каждом запускает расчет разных сложных функций. После завершения потоков в главную программу возвращаются характеристики рабочего набора этих потоков и результаты выполнения расчетов. Вся информация выводится на экран.

Процессы

Пример простой консольной программы приведен в листинге 1. Программа открывает текстовый файл, используя при этом два различных способа. Сначала происходит обращение к функции WinExec, которой напрямую сообщается имя программы текстового редактора и имя текстового файла, который должна открыть эта программа. Затем для открытия того же файла используется системный вызов ShellExecute (при этом, скорее всего, будет запущен WordPad или другая программа, ответственная в вашей системе за открытие текстовых файлов).

Листинг 1. Открытие текстового файла

#include <windows.h>

#include <iostream.h>

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

{

            cout<<"Открыто с помощью WinExec\n";

            // Открытие целевого файла

            if (WinExec("notepad readme.txt",SW_SHOW)<32)

                        MessageBox(NULL,"Не могу выполнить WinExec",NULL,MB_OK);

            cout<<"Нажмите Enter\n";

            MessageBox(NULL,"Нажмите OK для продолжения","Program Launched",MB_OK);

            cout<<"Открыто с помощью ShellExecute\n";

            if (ShellExecute(NULL,"open","readme.txt",NULL,NULL,SW_SHOW)<(HANDLE)32)

                        MessageBox(NULL,"Не могу выполнить ShellExecute\n",NULL,MB_OK);

}

При успешной работе программы будет дважды открыт файл readme.txt.


Вызов CreateProcess

В листингах 2 и 3 приведены два простых консольных приложения. Первая программа (MASTER) запускает вторую (SLAVE) и переходит в режим ожидания. Программа SLAVE читает идентификатор процесса (PID, Process Identifier) запустившей ее программы из командной строки и ожидает завершения работы программы MASTER. В командной строке программы MASTER вы можете указать полный путь к исполняемому файлу программы SLAVE.

Обе программы иллюстрируют несколько важных технологий:

·  использование CreateProcess;

·  использование OpenProcess;

·  использование WaitForSingleObject.

Обратите внимание, что MASTER не использует большую часть аргументов функции CreateProcess, поэтому в данном конкретном случае для запуска SLAVE вполне можно использовать вызов WinExec (см. комментарии в листинге 2).

Листинг 2  Master

#include <windows.h>

#include <iostream.h>

#include <stdio.h>

#include <string.h>

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

{

    char cmd[128];

            if (argc!=1)

                        strcpy(cmd,argv[1]);

            else

                        strcpy(cmd,"slave.exe");

            int pid=GetCurrentProcessId();

            sprintf(cmd+strlen(cmd)," %d",pid);

            cout<<"Master: Starting:" << cmd << "\n";

            cout.flush();

// Здесь пример использования  WinExec

            //         if (WinExec(cmd,SW_SHOW)<32)

// Если требуется использовать возможности CreateProcess:

            STARTUPINFO info;

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

            info.cb=sizeof(info);

            PROCESS_INFORMATION pinfo;

            if (!CreateProcess(NULL,cmd,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,

                        NULL,NULL,&info,&pinfo))

            {

                        cout<<"Master: Slave процесс не запущен\n";

                        cout<<"Master: попытайтесь указать имя процесса в ком. строке\n";

            }

            cout<<"Master: Sleeping\n";

            cout.flush();

            Sleep(15000);

Похожие материалы

Информация о работе