С чего начинается программирование...

читать лучше с начала!

На сайті розглядаються основи роботи з мультимедійною інформацією на персональному комп'ютері. Описано ряд програм для закису, обробки й відтворення звуку й зображення.

Представлено деякі Wіndows-програми комунікацій реального часу ( ІP-Телефонії).

Також сайт присвячен розробці власних програм для роботи з аудио й відео, передачі звукової й візуальної інформації в локальних мережах і Інтернеті.

Серед наших користувачів, як правило, користувачі комп'ютера в дома й в офіса, так і на починаючих розроблювачів програмного забезпечення - ми даємо основи програмування в середовищі Borland C++ Buіlder. Наша аудиторія - це, перш за все, школярі старших класів, студенти і широке коло людей, що просто використовують комп'ютер вдома й на роботі.

ОБРОБКА ТЕРМІНАЛОМ УВОДИТЬСЯ ИНФОРМАЦИИ, щоМ,



      Як уже обговорювалося раніше, за замовчуванням драйвер термінала роботает у канонічному режимі, тобто в режимі порядкової обробки. Коли ви уводите символи, драйвер очікує, поки ви натиснете повернення каретки, після чого передає для обробки весь рядок. Якщо ви працюєте не в канонічному режимі, те кожний символ передається для обробки непосередньо після уведення. Наочним прикладом такого режиму роботи является редактор vi. Ви натискаєте по одній клавіші для руху курсора, видалення символів і т.д., тому редактор vi, мабуть, повинен одержувати кожний символ відразу ж, як тільки натиснута клавіша.

      Яким образом це робиться в програмі? Прийом старий і часто використовується в UNIX, хоча й не дуже добре описаний у документації. Такого роду інформацію можна добути шляхом перегляду великої кількості текстів програм. Необхідно відзначити, що цей прийом найкраще работает у програмах мовою Си. Командні файли, написані мовою shell, можуть використовувати для цієї мети команду stty, але результат будет не той самий. Наступний фрагмент програми мовою Си отклюсподівається канонічну обробку, потім читає символи й виводить їх на экран.
1 #include
3 struct termio tsav, tchg;
5 main (argc, argv) 6 { 7 int c;
9 if (ioctl (0, TCGETA, &tsav) == -1) { 10 perror("can't get original settings");
      неможливо одержати вихідні установки 11 exit(1); 12 }
14 tchg = tsav;
16 tchg.c_lflag &= ~(ICANON | ECHO); 17 tchg.c_cc[VMIN] = 1; 18 tchg.c_cc[VTIME] = 0;
20 if (ioctl (0, TCSETA, &tchg) == -1) { 21 perror("can't initiate new settings");
      неможливо задати нові установки 22 }
24 while (1) 25 { 26 c = getchar();
28 if (c == 'x') 29 break;
31 putchar(c); 32 }
34 if (ioctl(0, TCSETA, &tsav) == -1) { 35 perror("can't reset original settings");
      неможливо повернути вихідні установки 36 exit(3); 37 } 38 }

      У нас є дві "термінальні" структури даних, одна йз яких містить вихідні установки, а інша - установки, які ми змінюємо і записуємо. Перший системний виклик ioctl одержує інформацію про установках термінала. Потім ми привласнюємо ці значення змінюваної структурі (рядок 14). Модифікації термінального інтерфейсу ми выполняем у рядках 16-18. Рядок 16 відключає канонічну обробку й луна-відображення символів. Рядок 17 установлює, що мінімальне доличество натискань на клавіші дорівнює одному. Рядок 18 визначає, що час очікування для повторного читання даних дорівнює 0. По суті, це блокове читання по одному символі.

      Нові значення термінальних характеристик установлюються в строке 20. У цей момент режим роботи термінала міняється. Цикл while читает, перевіряє й виводить символи. Тільки при уведенні символу x цикл завершается, термінал установлюється в первісний стан, і програма закінчує роботу.

      Як ми вже помітили, операція читання тут є блоковою. Це виходить, що програма очікує, поки ви введете символ. Якщо ви нічого не вводите, програма перебуває в нескінченному циклі очікування. Яким образом ми змінюємо режим читання із блокового на посимвольный?

      Це питання еквівалентне такому питанню: "Як опитати клавіатуру в UNIX?". Опитування є досить важливим прийомом для деяких применений. Опитування працює приблизно так: "Подивитися на клавіатуру. Якщо введен символ, одержати його і якимсь образом обробити. У противному випадку продовжувати робити те, що ви робили. Після витікання інтервалу часу, певного програмою, перевірити клавіатуру знову." Таким образом, якщо користувач не натискає на клавіші, програма продолжает роботу, а не очікує, поки що-небудь буде натиснуто на клавіатурі.

      Для виконання такої роботи нам потрібно трохи більш докладно розглянути термінальний інтерфейс. Як було відзначено раніше, термінал являє собою файл. Це значить, що він повинен мати всіма звичайними властивостями файлів - можливістю відкриття, закриття, читання, запису й т.д. Ми також бачили, що термінали мають протокол роботи, який може бути змінений командою stty. Ми бачили, що для одержання одного символу із клавіатури використовується протокол роботи. Тепер ми побачимо, що для виконання опитування ви повинні використовувати техніку, доторая ставиться до файлів, а не ioctl.

      Секрет тут у тім, щоб відкрити термінальний файл, змінюючи режим його відкриття. Потім для одержання одного символу використовується той же текст, що й у попередньому випадку - тим самим опитування досягнуть. От текст програми:
1 #include 2 #include
4 struct termio tsav, tchg;
6 main (argc, argv) 7 { 8 int c;
10/* change the terminal based on file primitives */
      змінити режим термінала за допомогою файлових примітивів 11 close(0); 12 if (open("/dev/tty",O_RDWR|O_NDELAY) == -1) { 13 perror("can't open tty");
      неможливо відкрити tty 14 exit(1); 15 }
17/* change the terminal based on line disciplines */
      змінити режим термінала за допомогою протоколу роботи 18 if (ioctl (0, TCGETA, &tsav) == -1) { 19 perror("can't get original settings");
      неможливо одержати вихідні установки 20 exit(2); 21 }
23 tchg = tsav;
25 tchg.c_lflag &= ~(ICANON | ECHO); 26 tchg.c_cc[VMIN] = 1; 27 tchg.c_cc[VTIME] = 0;
29 if (ioctl (0, TCSETA, &tchg) == -1) { 30 perror(can't initiate new settings");
      неможливо задати нові установки 31 }
33 while (1) 34 { 35 putchar('.'); 36 c = getchar();
38 if (c == 'x') 39 break;
41 putchar(c); 42 }
44 if (ioctl(0, TCSETA, &tsav) == -1) { 45 perror("can't reset original settings");
      неможливо повернути вихідні установки 46 exit(3); 47 } 48 }

      Основна зміна виробляється в рядках 11-15. Закриття файлу з нульовим дескриптором (який позначає стандартний пристрій уведення) закриває стандартне уведення. Потім ми знову відкриваємо файл /dev/tty. Значення дескриптора файлу дорівнює нулю, так що ми перепризначили стандартный уведення на новий пристрій. Фокус у тім, що при відкритті файлу використовується режим, називаний NODELAY. Це означає, що коли выполняется читання по даному дескрипторі файлу (тобто читання стандартного уведення), замість очікування уведення виконується перегляд, є чи там що-небудь, а потім робота триває.

      У нескінченному циклі рядок 35 друкує крапку. Коли ви запускаєте цю програму, на екран виводиться крапка, як тільки програма попадає у цикл. Якщо ви чекаєте, то продовжують виводитися крапки. Як тільки ви натиснете клавішу, виконається луна-відображення символу в проміжку між висновком крапок. Це демонструє, що програма працює в той час, коли ви нічого не робите.

[...]
Початок
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [160] [161] [162] [163] [164] [165] [166] [167] [168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] [180] [181] [182] [183] [184] [185] [186] [187] [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] [198] [199] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215] [216] [217] [218] [219] [220] [221] [222] [223] [224] [225] [226] [227] [228] [229] [230] [231] [232] [233] [234] [235] [236] [237] [238] [239] [240] [241] [242] [243] [244] [245] [246] [247] [248] [249] [250] [251] [252] [253] [254] [255] [256] [257] [258] [259] [260] [261] [262] [263] [264] [265] [266] [267] [268] [269] [270] [271] [272] [273] [274] [275] [276] [277] [278] [279] [280] [281] [282] [283] [284] [285] [286] [287] [288] [289] [290] [291] [292] [293] [294] [295] [296] [297] [298] [299] [300] [301] [302] [303] [304] [305] [306] [307] [308] [309] [310] [311] [312] [313] [314] [315] [316] [317] [318] [319] [320] [321] [322] [323] [324] [325] [326] [327] [328] [329] [330] [331] [332] [333] [334] [335] [336] [337] [338] [339] [340] [341] [342] [343] [344] [345] [346] [347] [348] [349] [350] [351] [352] [353] [354] [355] [356] [357] [358] [359] [360] [361] [362] [363] [364] [365] [366] [367] [368] [369] [370] [371] [372] [373] [374] [375] [376] [377] [378] [379] [380] [381] [382] [383] [384] [385] [386] [387] [388] [389] [390] [391] [392] [393] [394] [395] [396] [397] [398] [399] [400] [401] [402] [403] [404] [405] [406] [407] [408] [409] [410] [411] [412] [413] [414] [415] [416] [417] [418] [419] [420] [421] [422] [423] [424] [425] [426] [427] [428] [429] [430] [431] [432] [433] [434] [435] [436] [437] [438] [439] [440]