50130 (Системное программирование в операционных системах), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Системное программирование в операционных системах", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "50130"

Текст 3 страницы из документа "50130"

2. Керниган Б., Ричи Д., Фьюер А. Язык программирования Си. Задачи по языку С / Пер. с англ. - М.: Финансы и статистика, 1985. - 279с.


Алгоритм программы

Приложение А


---------------------- [на лист 2

Рисунок А.1. Алгоритм программы


------------------------ [с листа1

Рисунок А.1. Лист №2

Приложение Б

Текст программы

#include

#include "resource. h"

#include

#define WM_SHELLNOTIFY WM_USER+5

#define IDC_RESTORE 1000

#define TM 1001

typedef struct _SHEDULEDATA {

char fname [120] ;

char tname [6] ;

int h;

int m;

int s;

int priority;

int delay;

} SHEDULEDATA;

char * FileOpen (HWND hWnd);

int FindNext (SHEDULEDATA sd [30], int count);

void cstrcpy (char *a,char *b, int from, int count);

void MakeItStandart (SHEDULEDATA sd [30], int count);

void SubtDelay (SHEDULEDATA sd [30], int count, int delay);

int ReadShedule (HANDLE hFile,SHEDULEDATA sd [30]);

LRESULT CALLBACK WindowProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); // дескриптор окна

INT CALLBACK MyDlgProc (HWND hDlg, // обращается к dialog box

UINT uMsg, // сообщение

WPARAM wParam, // первый параметр сообщения

LPARAM lParam // второй параметр сообщения);

int APIENTRY WinMain (HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

WNDCLASS wcl;

HWND hWnd;

MSG lpMsg;

// заполнение структуры с параметрами окна программы

wcl. style=CS_HREDRAW|CS_VREDRAW; // стиль окна

wcl. lpfnWndProc=WindowProc; // ф-ция обработки событий окна // оконная процедура

wcl. cbClsExtra=0; // дополнительные байты класса

wcl. cbWndExtra=0; // дополнительные байты окна

wcl. hInstance=hInstance; // дескриптор экземпляра окна // дескриптор пиктограммы

wcl. hIcon=LoadIcon (NULL, IDI_APPLICATION);

wcl. hCursor=LoadCursor (NULL, IDC_ARROW); // дескриптор курсора

wcl. hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH);); // цвет фона

wcl. lpszMenuName=NULL; // имя ресурса с главным меню программы // ресурс меню, связанный с окном

wcl. lpszClassName="Pass"; // имя класса окна

if (! RegisterClass (&wcl))

return 0;

hWnd=CreateWindow (wcl. lpszClassName,"window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

ShowWindow (hWnd,SW_HIDE);

UpdateWindow (hWnd);

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

{

TranslateMessage (&lpMsg);

DispatchMessage (&lpMsg);

}

return lpMsg. wParam;

}

LRESULT CALLBACK WindowProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) // дескриптор окна

{

static HINSTANCE hInstance;

switch (message)

{

case WM_CREATE:

{

hInstance = ( (LPCREATESTRUCT) lParam) - >hInstance;

DialogBox (hInstance, IDD_DIAL,hWnd, MyDlgProc);

break;

}

case WM_DESTROY:

{

PostQuitMessage (0);

break;

}

default:

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

}

return 0;

}

INT CALLBACK MyDlgProc (HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)

{

static SHEDULEDATA sd [30] ;

static int count,nextexe,delayexe;

static char name [300] ;

char * n;

static BOOL frst, fileopen = FALSE,filewasopened=FALSE;

BOOL cp;

char tip [] ="запуск по расписанию\0";

UINT uId=111;

static NOTIFYICONDATA nfd;

int i;

static STARTUPINFO si;

static HANDLE hMenu,hTimer,hFile;

static PROCESS_INFORMATION pi;

switch (uMsg)

{

case WM_INITDIALOG:

{

si. cb=sizeof (STARTUPINFO);

GetStartupInfo (&si);

nfd. cbSize=sizeof (NOTIFYICONDATA);

nfd. hWnd=hDlg;

nfd. uID=uId;

nfd. uFlags=NIF_MESSAGE|NIF_TIP|NIF_ICON;

nfd. uCallbackMessage=WM_SHELLNOTIFY;

lstrcpy (nfd. szTip,tip);

nfd. hIcon=LoadIcon (NULL, IDI_WINLOGO);

hMenu = CreatePopupMenu ();

AppendMenu (hMenu,MF_ENABLED|MF_STRING, IDC_RESTORE,"восстановить");

AppendMenu (hMenu,MF_ENABLED|MF_SEPARATOR,0,0);

AppendMenu (hMenu,MF_ENABLED|MF_STRING, IDC_EXIT,"закрыть");

frst=TRUE;

SetDlgItemText (hDlg, IDC_TEXT,"");

return (TRUE);

}

case WM_CLOSE:

{

if (filewasopened)

CloseHandle (hFile);

Shell_NotifyIcon (NIM_DELETE,&nfd);

DestroyMenu (hMenu);

SendMessage (GetParent (hDlg),WM_DESTROY,0,0);

EndDialog (hDlg, 0);

return (TRUE);

}

case WM_SIZE:

{

if (wParam==SIZE_MINIMIZED)

{

ShowWindow (hDlg,SW_HIDE);

Shell_NotifyIcon (NIM_ADD,&nfd);

}

return TRUE;

}

case WM_TIMER:

{

cp=CreateProcess (sd [nextexe]. fname,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,NULL,&si,&pi);

KillTimer (hDlg,TM);

if (! cp)

{

if (MessageBox (hDlg,"Приложение не удалось запустить. Продолжить работу?",sd [nextexe]. fname,MB_YESNO|MB_ICONERROR) ==IDNO)

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

else

SendMessage (hDlg,WM_COMMAND, IDC_START,0);

}

else

{

nextexe=FindNext (sd,count);

if (nextexe<0)

{

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

return TRUE;

}

delayexe=sd [nextexe]. delay;

sd [nextexe]. delay=-1;

SubtDelay (sd,count,delayexe);

if (! SetTimer (hDlg,TM,1000*delayexe,NULL))

{

frst=TRUE;

if (MessageBox (hDlg,"В системе нет свободных таймеров. ",0,MB_RETRYCANCEL| MB_ICONERROR) ==IDRETRY)

SendMessage (hDlg,WM_COMMAND, IDC_START,0);

else

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

}

}

return TRUE;

}

case WM_SHELLNOTIFY:

{

POINT pn;

if (wParam==uId)

{

if (lParam==WM_RBUTTONDOWN)

{

GetCursorPos (&pn);

SetForegroundWindow (hDlg);

TrackPopupMenu (hMenu,TPM_RIGHTALIGN,pn. x,pn. y,0,hDlg,NULL);

PostMessage (hDlg,WM_NULL,0,0);

}

else if (lParam==WM_LBUTTONDOWN)

SendMessage (hDlg,WM_COMMAND, IDC_RESTORE,0);

}

return TRUE;

}

case WM_COMMAND:

switch (LOWORD (wParam))

{

case IDC_EXIT:

{

if (filewasopened)

CloseHandle (hFile);

Shell_NotifyIcon (NIM_DELETE,&nfd);

DestroyMenu (hMenu);

SendMessage (GetParent (hDlg),WM_DESTROY,0,0);

EndDialog (hDlg,0);

return TRUE;

}

case IDC_OPEN:

{

n=FileOpen (hDlg);

if (n! =0)

{

lstrcpy (name,n);

fileopen=TRUE;

SetDlgItemText (hDlg, IDC_TEXT,name);

}

return TRUE;

}

case IDC_START:

{

if (frst)

{

if (! fileopen)

{

i=GetDlgItemText (hDlg, IDC_TEXT,name,120);

if (i==0)

{

MessageBox (hDlg,"введите имя файла с расписанием","ожидается ввод",MB_OK);

return TRUE;

}

}

if ( (hFile=CreateFile (name,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) ==INVALID_HANDLE_VALUE)

MessageBox (0,"Не удается открыть файл с расписанием","error",MB_APPLMODAL|MB_OK|MB_ICONSTOP);

filewasopened=FALSE;

return TRUE;

}

filewasopened=TRUE;

count=ReadShedule (hFile,sd);

if (count <=0)

{

MessageBox (hDlg,"Файл не соответствует формату",NULL,MB_OK|MB_ICONERROR);

return TRUE;

}

CloseHandle (hFile);

MakeItStandart (sd,count);

filewasopened=frst=FALSE;

}

nextexe=FindNext (sd,count);

if (nextexe<0)

{

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

return TRUE;

}

delayexe=sd [nextexe]. delay;

sd [nextexe]. delay=-1;

SubtDelay (sd,count,delayexe);

SendMessage (hDlg,WM_SIZE,SIZE_MINIMIZED,0);

if (! SetTimer (hDlg,TM,1000*delayexe,NULL))

{

frst=TRUE;

if (MessageBox (hDlg,"В системе нет свободных таймеров. ",0,MB_RETRYCANCEL| MB_ICONERROR) ==IDRETRY)

SendMessage (hDlg,WM_COMMAND, IDC_START,0);

else

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

}

return TRUE;

}

case IDC_STOP:

{

if (! frst)

{

KillTimer (hDlg,TM);

count =0;

nextexe=-1;

frst=TRUE;

MessageBox (hDlg,"в расписании больше нет задач","Завершение",MB_OK|MB_ICONINFORMATION);

}

return TRUE;

}

case IDC_RESTORE:

{

Shell_NotifyIcon (NIM_DELETE,&nfd);

ShowWindow (hDlg,SW_RESTORE);

SetForegroundWindow (hDlg);

return TRUE;

}

}

return TRUE;

}

return FALSE;

}

char * FileOpen (HWND hWnd)

{

OPENFILENAME filename;

char name [512] = "";

ZeroMemory (&filename, sizeof (filename));

filename. lStructSize = sizeof (filename);

filename. hwndOwner = hWnd;

filename. lpstrFile = name;

filename. lpstrFile [0] = '\0';

filename. nMaxFile = sizeof (name);

filename. lpstrFilter = "Text files\0*. txt\0";

filename. nFilterIndex = 1;

filename. lpstrFileTitle = "Выберите имя файла для сравнения... ";

filename. nMaxFileTitle = 0;

filename. lpstrInitialDir = NULL;

filename. Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

if (GetOpenFileName (&filename) ! = NULL)

return (filename. lpstrFile);

else

return 0;

}

int ReadShedule (HANDLE hFile,SHEDULEDATA sd [30])

{

char str [200] ="";

char symb;

char buff [2] ="";

int w;

BOOL IsComm;

int numb;

int i;

int j;

for (i=0; i<30; i++)

{

j=-1;

w=0;

while (1)

{

ReadFile (hFile,&symb,1,&numb,NULL);

if (numb==0)

return i+1;

if (symb=='\\')

symb='/';

if ( (j==-1) && (symb! ='"'))

return - 1;

else

if (j==-1)

{

IsComm=TRUE;

j++;

continue;

}

else

if (IsComm)

if (symb=='"')

{

IsComm=FALSE;

sd [i]. fname [j] =0;

j=0;

continue;

}

else

{

sd [i]. fname [j] =symb;

j++;

continue;

}

else

if ( (symb==0xd) || (symb==' ') || (symb==': '))

continue;

if ( (symb! =0xa))

{

if (j>5)

return - 1;

sd [i]. tname [j] =symb;

j++;

continue;

}

else

break;

}

}

return i+1;

}

void cstrcpy (char *a,char *b, int from, int count)

{

int i;

int j=0;

for (i=from; i

{

b [j] =a [i] ;

j++;

}

}

void MakeItStandart (SHEDULEDATA sd [30], int count)

{

int i;

SYSTEMTIME st;

char buffer [2] ;

int uis;

int uil;

int ui;

GetLocalTime (&st);

for (i=0; i

{

cstrcpy (sd [i]. tname,buffer,0,2);

sd [i]. h=atoi (buffer);

cstrcpy (sd [i]. tname,buffer,2,2);

sd [i]. m=atoi (buffer);

cstrcpy (sd [i]. tname,buffer,4,2);

sd [i]. s=atoi (buffer);

uil=sd [i]. h*3600+sd [i]. m*60+sd [i]. s;

uis=st. wHour*3600+st. wMinute*60+st. wSecond;

ui=uil-uis;

if (ui<0)

sd [i]. delay=ui+24*3600;

else

sd [i]. delay=ui;

}

}

int FindNext (SHEDULEDATA sd [30], int count)

{

int i,min=0xFFFFFFF;

int minnumber=-1;

for (i=0; i

{

if (sd [i]. delay<0)

continue;

else

if (sd [i]. delay

{

min=sd [i]. delay;

minnumber=i;

}

}

return minnumber;

}

void SubtDelay (SHEDULEDATA sd [30], int count, int delay)

{

int i;

for (i=0; i

if (sd [i]. delay>=0)

sd [i]. delay-=delay;

}

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4144
Авторов
на СтудИзбе
666
Средний доход
с одного платного файла
Обучение Подробнее