Министерство образования и науки Российской Федерации
Федеральное агенство по образованию
Государственное образовательное
учреждение
высшего профессионального образования
«Комсомольский-на-Амуре государственный технический университет»
Факультет Компьютерных технологий
Кафедра математического обеспечения и применения ЭВМ
По курсу «ОСЗР»
Выполнил: Рогозин В.А.
Проверил: Тихомиров В.А.
Вариант: 16
Комсомольск-на-Амуре
2007
Цель: Изучить теоретические вопросы управления потоками в ОС 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);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.