Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Курсова робота
з дисципліни: «Системне програмне забезпечення»
на тему: «Моніторинг USB-пристроїв»
Анотація
В даній курсовій роботі реалізована програма моніторингу USB-пристроїв. Дана програма оприділяє усі пристрої, підключені до usb; працює з веб-камерою з можливістю робити знімки, а також робота з запам’ятовуючими пристроями. Для того щоб правильно організувати роботу програми, її було розбито на декілька основних частин. Для отримання інформації про USB-концентратор використовувалась api-функція, також у програмі використовується багатопотоковість для покращення роботи.
Засобом створення програми було середовище Visual Studio 2010 . Мова на якій написана программа С#.
ЗМІСТ
ВСТУП 5
1. Оглядовий розділ 6
1.1. Підключення dll бібліотек до проекту 6
1.2. Загальна інформація про USB
1.3. Моніторинг USB-концентратора 8
2. Робота з веб-камерою
3. Робота зі змінними пристроями та каталогами
3.1. Робота зі знімними пристроями
3.2. Створення каталогу
4. Створення незалежних потоків у програмі
4.1. Приклад використання потоків
4.2. Реалізація потоків у проекті 26
ВИСНОВКИ 27
СПИСОК ЛІТЕРАТУРИ 28
Додаток А. Текст програми
ВСТУП
На сьогоднішній день робота з комп’ютером неможлива без USB. Він використовується для підключення пристроїв вводу\виводу (комп’ютерні миші, клавіатури, принтери), медіа пристроїв (мобільні телефони, цифрові камери, музичні плеєри) і найголовніше запам’ятовуючі пристрої. З огляду на розвиток сучасних комп’ютерних технологій дисководи разом з оптичними дисками відійдуть в забуття, через поширене використання USB разом з флеш носіями. Адже використання таких пристроїв набагато зручніше для запису, збереження та передання даних і різного роду інформації.
Тому вважаю написання такого роду системної програми достатньо доцільним для сьогодення. Завдяки цьому проекту можна контролювати, які пристрої підключено до комп’ютера через USB, працювати з запам’ятовуючими пристроями та веб-камерою.
Оглядовий розділ
1.1. Підключення dll бібліотек до проекту
DLL (англ. dynamic-link library - «бібліотека динамічного компонування», «Колективна бібліотека») - поняття операційних систем Microsoft Windows і IBM OS / 2, динамічна бібліотека, що дозволяє багаторазове використання різними програмними додатками. До DLL відносяться також елементи управління ActiveX і драйверів. У світі UNIX аналогічні функції виконують так звані загальні об'єкти (англ. shared objects).
Формат файлів DLL дотримується тих же угод, що і формат виконуваних файлів, поєднуючи код, таблиці та ресурси, відрізняючись лише інтерпретацією деяких полів.
Спочатку передбачалося, що введення DLL дозволить ефективно організувати пам'ять та дисковий простір, використовуючи тільки один примірник бібліотечного модуля для різних додатків. Це було особливо важливо для ранніх версій Microsoft Windows з жорсткими обмеженнями по пам'яті.
Далі, передбачалося поліпшити ефективність розробок і використання системних засобів за рахунок модульності. Заміна DLL-програм з однієї версії на іншу повинна була дозволити незалежно нарощувати систему, не зачіпаючи додатків. Крім того, динамічні бібліотеки могли використовуватися різнотипними додатками - наприклад, Microsoft Office, Microsoft Visual Studio і т. п.
Надалі ідея модульності виросла в концепції Component Object Model і System Object Model.
Фактично, повних переваг від впровадження динамічно підключаються бібліотек отримати не вдалося через явища, званого DLL hell («пекло DLL»). DLL hell виникає, коли кілька додатків вимагають одночасно різні, що не повністю сумісні, версії бібліотек, що призводить до збоїв в цих додатках і до конфліктів типу DLL hell, різко знижуючи загальну надійність операційних систем. Пізні версії Microsoft Windows стали дозволяти паралельне використання різних версій DLL (технологія SxS), що звело нанівець переваги споконвічного принципу модульності.
Принцип роботи dll функцій:
/
Внутрішня структура dll бібліотеки:
/
Нище приведено приклад використання бібліотек Dllimport:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; // эту строку добавил стало меньше ошибок
namespace myprogram
{
[DllImport("mydll.dll")]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
Підключення функції capCreateCaptureWindowA з бібліотеки
avicap/dll для роботи створення нового оглядача веб-камери:
[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
Підключення функції SendMessage з бібліотеки user32.dll бібліотеки для відправки повідомлень операційній системі Windows системою управління Windows Message:
[DllImport("user32", EntryPoint = "SendMessage")]
1.2. Загальна інформація про USB
USB (англ. Universal Serial Bus, абревіатура читається ю-ес-бі) — укр. універсальна послідовна шина, призначена для з'єднання периферійних пристроїв. Символом USB є чотири геометричні фігури: квадрат,трикутник, велике коло та мале коло.
Шина USB представляє собою послідовний інтерфейс передавання даних для середньо швидкісних та низько швидкісних периферійних пристроїв. Для високошвидкісних пристроїв на сьогодні кращим вважається FireWire.
USB-кабель представляє собою дві звиті пари: по одній парі відбувається передавання даних в кожному напрямку (диференціальне включення), а інша пара використовується для живлення периферійного пристрою (+5 В). Завдяки вбудованим лініям живлення, що забезпечують струм до 500 мА, USB часто дозволяє використовувати пристрої без власного блоку живлення (якщо ці пристрої споживають струм силою не більше 500 мА).
Поєднання USB-кабелями формує інтерфейс між USB-пристроями та USB-хостом. В якості хоста використовується керований з операційної системи USB-контролер, до складу якого входить USB-концентратор, або ж хаб. Цей хаб є відправною точкою у створенні ланцюжка пристроїв, що відповідають вимогами топології «зірка». Він має спеціальну назву — кореневий концентратор. До його портів під'єднується інше USB-приладдя та зовнішні хаби. Загальні їх кількість не може перевищувать 127 пристроїв, увімкнених не більш ніж у п'ять каскадів, не рахуючи рівень кореневого хаба.
Клас для роботи з пристроями:
using System;
using System.IO;
class Test
{
public static void Main()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Drive {0}", d.Name);
Console.WriteLine(" File type: {0}", d.DriveType);
if (d.IsReady == true)
{
Console.WriteLine(" Volume label: {0}", d.VolumeLabel);
Console.WriteLine(" File system: {0}", d.DriveFormat);
Console.WriteLine(
" Available space to current user:{0, 15} bytes",
d.AvailableFreeSpace);
Console.WriteLine(
" Total available space: {0, 15} bytes",
d.TotalFreeSpace);
Console.WriteLine(
" Total size of drive: {0, 15} bytes ",
d.TotalSize);
}
}
}
}
/*
This code produces output similar to the following:
Drive A:\
File type: Removable
Drive C:\
File type: Fixed
Volume label:
File system: FAT32
Available space to current user: 4770430976 bytes
Total available space: 4770430976 bytes
Total size of drive: 10731683840 bytes
Drive D:\
File type: Fixed
Volume label:
File system: NTFS
Available space to current user: 15114977280 bytes
Total available space: 15114977280 bytes
Total size of drive: 25958948864 bytes
Drive E:\
File type: CDRom
The actual output of this code will vary based on machine and the permissions
granted to the user executing it.
*/
1.3. Моніторинг USB-концентратора
Ознайомлення з пристроями, які опізнаватиме програма:
1.HID (human interface device) - це тип комп'ютерного пристрою для прямої взаємодії з людиною. Слугує для введення або виведення даних. Термін «HID» найчастіше використовується у зв'язку з типізацією USB пристроїв. Термін був введений Майком Ван Фланденом коли він запропонував USB-комітету створити робочу групу для пристроїв типу Human Input Device. Зміна на Human Interface Device була здійснена після зазначення Томом Шмідтом того, що запропоновані стандарти підтримують двонаправлену комунікацію.
2.За допомогою кабелів формується інтерфейс між USB-пристроями і USB-хостом. В якості хоста виступає програмно-керований USB-контролер, який забезпечує функціональність всього інтерфейсу. Контролер, як правило, інтегрований в мікросхему південного мосту, хоча може бути виконаний і в окремому корпусі. З'єднання контролера з зовнішніми пристроями відбувається через USB-концентратор (інші назви - хаб, розгалужувач). У силу того, що USB-шина має деревоподібну топологію, концентратор самого верхнього рівня називається кореневим (root hub). Він вбудований в USB-контролер і є його невід'ємною частиною.
3.Флеш-пам'ять (англ. flash memory) - різновид напівпровідникової технології електрично перепрограммируемой пам'яті (EEPROM). Це ж слово використовується в електронній схемотехніці для позначення технологічно закінчених рішень постійних запам'ятовуючих пристроїв у вигляді мікросхем на базі цієї напівпровідникової технології. У побуті це словосполучення закріпилося за широким класом твердотільних пристроїв зберігання інформації.
Завдяки компактності, дешевизні, механічної міцності, великому обсягу, швидкості роботи і низькому енергоспоживанню, флеш-пам'ять широко використовується в цифрових портативних пристроях і носіях інформації. Серйозним недоліком даної технології є обмежений термін експлуатації носіїв, а також чутливість до електростатичного розряду.
4. Принтер (від англ. Print - друк; сін. Друкувальний пристрій) - периферійний пристрій комп'ютера, призначене для перекладу тексту або графіки на фізичний носій з електронного виду малими тиражами (від одиниць до сотень) без створення друкованої форми. Цим принтери відрізняються від поліграфічного обладнання та різографів, яке за рахунок друкарської форми швидше і дешевше на великих тиражах (сотні і більше примірників).
Набули поширення багатофункціональні пристрої (БФП), в яких в одному приладі об'єднані функції принтера, сканера, копіювального апарату і телефаксу. Таке об'єднання раціонально технічно і зручно в роботі.
Порядок реалізації:
Організувати структури даних для збереження інформації про USB-пристрої.
Сформувати запит до USB-контроллера засобами ManagementObjectSearcher:
String Win32_USBControlerDevice="Select*From Win32_USBControllerDevice";
ObjectQuery query = new ObjectQuery(Win32_USBControlerDevice);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
Результати роботи програми:
/
2. Робота з веб-камерою
Веб-ка́мера (також вебкамера) — цифровавідео чи фотокамера, яка має можливість в реальному часі фіксувати зображення, призначені для подальшої передачі по мережі Інтернет (в програмах типу Skype, Instant Messenger тощо).
Історія створення : Все почалося в одній з комп'ютерних лабораторій Кембриджу ще на початку 90-х років минулого століття, коли Глобальна павутина тільки-тільки починала свою переможну ходу по планеті. Група вчених, чоловік 15-20, працювала над проектом у галузі мережевих технологій. Умови роботи були спартанськими — на всю команду припадала всього одна кавоварка, яка не могла задовольнити потреби всього колективу. Основна робота велася в лабораторії, персонал жив у цьому ж будинку, але в іншій його частині. Щоб покращити розумовий процес чашечкою напою, що бадьорить, учасники наукового проекту були змушені часто відвідувати коридор, який перебував поверхом вище, де і розташовувалася кавоварка. Найчастіше такі походи були неуспішними, так як деякі колеги вже встигали спорожнити жадану ємність. Ситуація вимагала нестандартного рішення, і воно було знайдене. Один з комп'ютерів в лабораторії мав пристрій відеоспостереження (frame grabber). До нього підключили камеру, яка була спрямована на об'єкт спостереження. Цей же комп'ютер відігравав роль web-сервера за рахунок спеціально написаного програмного забезпечення. Бажаючі знати, чи є кава, повинні були запустити на своєму комп'ютері клієнтське ПЗ, що з'єднуються з сервером. В результаті на віддаленому комп'ютері в маленькому віконці виводилося чорно-біле зображення, котре оновлювалося три рази в хвилину. Замітка про цю цікавинку була опублікована в журналі Comm-Week 27 січня 1992. З моменту появи перших прототипів IP камер пройшло не так вже багато часу, але вони вже перетворилися в цілком сформувався, окремий клас пристроїв, які роблять повсякденне життя простішим, зручнішим і веселішим.
WebCamDevice[] WebCams;
public class WebCamDevice
{
//имя устройства
public string Name { get; set; }
//версия
private string Version;
//номер
private short Index;
//Handle
private int mCapHwnd = 0;
[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
//получает handle окна
public static extern int capCreateCaptureWindowA(
string lpszWindowName, //Нуль-терминальная строка, содержащая имя окна захвата.
int dwStyle, //стиль окна
int X, //координата X
int Y, //координата Y
int nWidth, //ширина окна
int nHeight, //высота окна
int hwndParent, //handle родительского окна
int nID //идентификатор окна
);
[DllImport("avicap32.dll")]
//получить список установленных устройств видео захвата
protected static extern bool capGetDriverDescriptionA(
short wDriverIndex, //индекс драйвера видео захвата. Значение индекса может варьироваться от 0 до 9.
[MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszName, //указатель на буфер, содержащий соответствующее имя драйвера
int cbName, //размер (в байтах) буфера lpszName
[MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszVer, //указатель на буфер, содержащий описание определенного драйвера.
int cbVer //размер буфера (в байтах), в котором хранится описание драйвера.
);
[DllImport("user32", EntryPoint = "SendMessage")]
//отправляет сообщения
public static extern int SendMessage(
int hWnd, //Дескриптор окна, оконная процедура которого примет сообщение
uint Msg, //Определяет сообщение, которое будет отправлено.
int wParam, //Определяет дополнительную конкретизирующую сообщение информацию.
int lParam //Определяет дополнительную конкретизирующую сообщение информацию.
);
[DllImport("user32")]
protected static extern bool SetWindowPos(
int hWnd,
int hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags
);
//Пользовательское сообщение
private const int WM_CAP = 0x400;
//соединение с драйвером устройства видеозахвата
private const int WM_CAP_DRIVER_CONNECT = 0x40a;
//разрыв связи с драйвером видеозахвата
private const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
//копирование кадра в буффер обмена
private const int WM_CAP_EDIT_COPY = 0x41e;
//включение/отключение режима предпросмотра
private const int WM_CAP_SET_PREVIEW = 0x432;
//включение/отключение режима оверлей
private const int WM_CAP_SET_OVERLAY = 0x433;
//Скорость previewrate
private const int WM_CAP_SET_PREVIEWRATE = 0x434;
//Включение/отключение масштабирования
private const int WM_CAP_SET_SCALE = 0x435;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
//Установка callback функции для preview
private const int WM_CAP_SET_CALLBACK_FRAME = 0x405;
//Получение одиночного фрейма с драйвера видеозахвата
private const int WM_CAP_GET_FRAME = 0x43c;
//Сохранение кадра с камеры в файл.
private const int WM_CAP_SAVEDIB = 0x419;
//максимальное количество попыток соединения
private const int MAX_TRY_CONNECT = 100;
//запускаем захват видео с данной камеры
public bool Connect(/*Control*/PictureBox picBox)
{
//узнаём хэндл
mCapHwnd = capCreateCaptureWindowA(Index.ToString(), WS_VISIBLE | WS_CHILD, 0, 0, picBox.Width, picBox.Height, picBox.Handle.ToInt32(), 0);
bool isConnected = false;
//пробуем запустить устройство
for (int i = 0; i < MAX_TRY_CONNECT; i++)
if (SendMessage(mCapHwnd, WM_CAP_DRIVER_CONNECT, Index, 0) > 0)
{
SendMessage(mCapHwnd, WM_CAP_SET_SCALE, -1, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEWRATE, 0x42, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, -1, 0);
SetWindowPos(mCapHwnd, 1, 0, 0, picBox.Width, picBox.Height, 6);
isConnected = true;
break;
}
if (!isConnected)
//в случае неудачи сообщаем пользователю
isConnected = false;
return isConnected;
}
//взятие скриншота
public Image TakePicture()
{
SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);
SendMessage(mCapHwnd, WM_CAP_EDIT_COPY, 0, 0)
return Clipboard.GetImage();
}
//отключаем камеру
public void Disconnect()
{
SendMessage(mCapHwnd, WM_CAP_DRIVER_DISCONNECT, mCapHwnd, 0);
}
//Возвращает массив всех доступных веб-камер
public static WebCamDevice[] GetAllWebCams()
{
//имя
String dName = "".PadRight(100);
//версия
String dVersion = "".PadRight(100);
//список камер
List<WebCamDevice> WebCams = new List<WebCamDevice>();
for (short i = 0; i < 10; i++)
{
//проверяем камеру с индексом i
if (capGetDriverDescriptionA(i,
ref dName, 100, ref dVersion,
100))
//если есть добавляем её к списку
WebCams.Add(new WebCamDevice(i, dName.Trim(), dVersion.Trim()));
}
//преобразуем список в массив
return WebCams.ToArray();
}
//конструктор
public WebCamDevice(short index, string name, string version)
{
Index = index;
Name = name;
Version = version;
}
}
private void button3_Click(object sender, EventArgs e) //показати картинку
{
if (WebCamConnected == false)
{
WebCamConnected = true;
button3.Text = "Відключити";
WebCams[0].Connect(pictureBox1);
}
else
{
WebCamConnected = false;
button3.Text = "Показати";
WebCams[0].Disconnect();
}
}
private void button4_Click(object sender, EventArgs e) //оновити
{
comboBox1.Items.Clear();
int Count;
WebCams = WebCamDevice.GetAllWebCams();
Count = WebCams.Length;
foreach (WebCamDevice wcd in WebCams)
comboBox1.Items.Add(wcd.Name);
if (comboBox1.Items.Count == 0)
{
comboBox1.Text = "Web cams doesn`t exist";
}
else
{
comboBox1.Text = (string)comboBox1.Items[0];
}
}
Демонстрація роботи блоку для роботи з веб-камерою:
/
3. Робота зі змінними пристроями та каталогами
USB флеш-накопи́чувач (скор. UFD, сленгове флешка) — носій інформації, що використовує флеш-пам'ять для збереження даних та підключається до комп’ютера чи іншого пристрою через USB-порт. UFD зазвичай є перезаписуваним пристроєм. Розмір — близько 5 см, вага — менше, ніж 60 г. Отримали надзвичайну популярність у 2000-ні у зв'язку з компактністю, легкістю перезаписування файлів і великого обсягу пам'яті (від 32 Мб до 256 Гб.[3]). Основне призначення — зберігання, перенесення і обмін файлами, резервне копіювання, завантаженняопераційних систем тощо.
3.1. Робота зі знімними пристроями
///
///виявлення підключення нових накопичувачів
///
const int WM_DeviceChange = 0x219;
const int DBT_DEVICEARRIVAL = 0x8000;
const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_DeviceChange)
{
if (m.WParam.ToInt32() == DBT_DEVICEARRIVAL)
{
MessageBox.Show("Підєднано новий пристрій!");
DriveInfo[] pgg = DriveInfo.GetDrives();
comboBox2.Items.Clear();
foreach (DriveInfo driveinfo in pgg)
{
if (driveinfo.DriveType.ToString() == "Removable")
comboBox2.Items.Add(driveinfo.Name);
}
}
if (m.WParam.ToInt32() == DBT_DEVICEREMOVECOMPLETE)
{
MessageBox.Show("Пристрій витягнуто");
}
}
}
DriveInfo[] pgg = DriveInfo.GetDrives();
comboBox2.Items.Clear();
foreach (DriveInfo driveinfo in pgg)
{
if (driveinfo.DriveType.ToString() == "Removable")
comboBox2.Items.Add(driveinfo.Name);
}
static List<USBDeviceInfo> GetUSBDevices()
{
List<USBDeviceInfo> devices = new List<USBDeviceInfo>();
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
collection = searcher.Get();
foreach (var device in collection)
{
devices.Add(new USBDeviceInfo(
(string)device.GetPropertyValue("DeviceID"),
(string)device.GetPropertyValue("PNPDeviceID"),
(string)device.GetPropertyValue("Description")
));
}
collection.Dispose();
return devices;
}
3.2. Створення каталогу
void RenewListView(string path)
{
List<string> dirs = new List<string>(Directory.GetDirectories(path));
List<string> files = new List<string>(Directory.GetFiles(path));
dirs.Sort();
files.Sort();
listView1.Items.Clear();
foreach (string dirName in dirs)
listView1.Items.Add(Path.GetFileName(dirName) + "\\");
foreach (string fileName in files)
listView1.Items.Add(Path.GetFileName(fileName));
}
4. Створення незалежних потоків у програмі
В програмуванні термін потік (англ. stream) використовується в кількох значеннях, але у всіх випадках посилаються на послідовність елементів даних, що стають доступними через якийсь час.
В Unix і споріднених системах, заснованих на мові програмування C, потік — це джерело або призначення даних, зазвичай індивідуальних байтів або знаків. Потоки — це абстракція, що використовується наприклад при читанні або записі файлів, або при зв'язку з вузлами мережі. Три стандартні потоки передвизначені і доступні для всіх програм. В мові C++ концепція потоків реалізована у бібліотеці iostream і низці похідних від неї.Файлова система може підтримувати багато іменнованих незалежних потоків для одного файлу. Є один головний потік, який передає нормальні дані з файлу. Додаткові потоки можуть використовуватися, щоб запам'ятати іконки, короткий звіт і індексацію інформації, зональну інформацію (для файлів, що завантажуються) тощо.
Конвеєри можуть також розумітися, як потоки, також як і будь-яка необмежена (не упакована) інформація, що постачається периферійним пристроєм.
У мові програмування Scheme і деяких інших, потік — ліниво оцінена або затримана послідовність елементів даних. Потік може використовуватися так само як список, але останні елементи обчислюються тільки тоді, коли потрібно. Тому потоки можуть представити нескінченні послідовності.
Поточні обчислення, — в паралельному виконанні, особливо в графічній обробці, термін потік застосовується і до апаратних засобів, і до програмного забезпечення. Ним позначають квазі-безперервний потік даних, які обробляються на потоковій мові програмування, щойно програмний стан задовольняє початковій умові потоку.
Хоча в кожної ниті свій контекст виконання, кожна нить усередині одного процесу використовує його віртуальний адресний простір (а також інші ресурси, які належать процесу). Це означає, що всі ниті в процесі можуть записувати й зчитувати вміст пам'яті інших нитей цього процесу. Але ниті не можуть посилатися на адресний простір іншого процесу. Виняток може бути в ситуації, коли процес надає частину свого адресного простору як розділ загальної пам'яті через об'єкт «проектований файл» (file mapping object), або коли один із процесів має право на відкриття іншого процесу й використовує функції доступу до пам'яті між процесами.
За замовчуванням у ниті немає власного маркера доступу, але він може отримати його, і це дозволить йому підміняти контекст захисту іншого процесу. Нить містить такі важливі елементи:
завантажений для виконання код;
вміст набору регістрів процесора, що відображають стан процесора;
два стеки, один із яких використовується ниттю при виконанні в режимі ядра, а інший — у користувацькому режимі;
закриту область пам'яті, яку називають локальною пам'яттю ниті (thread-local storage, TLS); вона використовується підсистемами, бібліотеками виконавчих систем (run-time libraries) і DLL;
унікальний ідентифікатор ниті;
іноді ниті мають свій контекст захисту, який використовується багатонитевими серверними програмами, що підміняють контекст захисту клієнтів.
Багатонитевість програми створює підґрунтя для реалізації реальної багатозадачності — виконання кількох завдань одночасно (якщо обчислювальна система є багатопроцесорною), або «псевдоодночасно» («майже одночасно») на однопроцесорних системах. Наявність кількох нитей дозволяє:
Оптимізувати організацію поведінки програми. Часто поведінка програми може бути організована у кілька незалежних паралельних алгоритмів, тоді їх можна винести в окремі ниті. При цьому їм можна задавати різний пріоритет виконання.
Обходити критичні до часу операції. Якщо програма має лише одну нить, то вона повинна зупинити все виконання при очікуванні повільних операцій, таких як запис у файл чи відображення засобами мультимедіа. При цьомупроцесор перебуває у простої, поки ця операція не завершиться. Якщо застосунок складається з кількох нитей, він може продовжувати виконання в окремих нитях, коли одна нить очікуватиме на завершення повільної операції.
Реалізувати багатопроцесорну обробку. Якщо система, у якій працює програма, є мультипроцесорною, то можна сповна скористатися наявними обчислювальними ресурсами і підвищити її ефективність використанням кількох нитей. При цьому різні ниті можуть виконуватися одночасно на різних процесорах.
Таким чином, доцільне використання нитей може значно поліпшити продуктивність і зручність використання програм.
На одному процесорі багатонитевість відбувається шляхом тимчасової активізації різних нитей. Таке перемикання відбувається досить часто, щоб користувач сприймав виконання нитей як одночасне. У багатопроцесорних і багатоядерних системах ниті можуть реально виконуватися одночасно, при цьому кожен процесор або ядро обробляє окрему нить (або кілька нитей).
4.1. Приклад використання потоків
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample {
// The ThreadProc method is called when the thread starts.
// It loops ten times, writing to the console and yielding
// the rest of its time slice each time, and then ends.
public static void ThreadProc() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("ThreadProc: {0}", i);
// Yield the rest of the time slice.
Thread.Sleep(0);
}
}
public static void Main() {
Console.WriteLine("Main thread: Start a second thread.");
// The constructor for the Thread class requires a ThreadStart
// delegate that represents the method to be executed on the
// thread. C# simplifies the creation of this delegate.
Thread t = new Thread(new ThreadStart(ThreadProc));
// Start ThreadProc. Note that on a uniprocessor, the new
// thread does not get any processor time until the main thread
// is preempted or yields. Uncomment the Thread.Sleep that
// follows t.Start() to see the difference.
t.Start();
//Thread.Sleep(0);
for (int i = 0; i < 4; i++) {
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
t.Join();
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
Console.ReadLine();
}
}
4.2. Реалізація потоків у проекті
using System;
private void button1_Click(object sender, EventArgs e)
{
USBThread = new Thread(GetUsbDevisesNames);
USBThread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
USBThread =new Thread(GetAllUsbDevices);
USBThread.Start();
}
private void button5_Click(object sender, EventArgs e)
{
try
{
RenewListView(comboBox2.SelectedItem.ToString());
}
catch
{
MessageBox.Show("Оберіть пристрій");
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
Process.Start(comboBox2.SelectedItem.ToString() + listView1.SelectedItems[0].Text);
}
СПИСОК ЛІТЕРАТУРИ
1. Олифер В. Г., Олифер Н. А. Сетевые операционные системы. —
СПб.: Питер, 2001. — 554 с
2. Столлинз Р. Операционные системы. — М.: Вильямс, 2002. —
600 с.
А також з сайтів:
3. http://MSDN.ru
4.http://wikipedia.org
Додаток А. Текст програми
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using Microsoft.Win32;
using System.Management;
using System.Diagnostics;
using System.Threading;
namespace USB_monitor
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool WebCamConnected;
/// <summary>
/// клас для роботи з USB-пристроями
class USBDeviceInfo
{
public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
{
this.DeviceID = deviceID;
this.PnpDeviceID = pnpDeviceID;
this.Description = description;
}
public string DeviceID { get; private set; }
public string PnpDeviceID { get; private set; }
public string Description { get; private set; }
}
/// </summary>
/// <summary>
///
static List<USBDeviceInfo