Реально ли организовать выполнение 2-х и более операций одновременно - C (СИ)
Формулировка задачи:
Добрый вечер. Такой вопрос. Программа работает в консоли. Реально ли на си в организовать выполнение 2-х и более операций. К примеру, в программе выполняется таймер и перерисовывается символ каждые 0,5 сек(в позиции 1), но одновременно отслеживались события клавиатуры (сейчас я их отслеживаю с помощью getch) и при нажатии на клавишу(выводился символ №2 (в позиции 2)). Если это реально посоветуйте что почитать. Заранее спасибо.
Решение задачи: «Реально ли организовать выполнение 2-х и более операций одновременно»
textual
Листинг программы
#include <windows.h> #include <string.h> #include <stdio.h> volatile BOOL g_done = FALSE; struct info { LONG delay; short x, y; WORD color; }; DWORD WINAPI thread_timer(LPVOID arg){ struct info inf; DWORD n, l; COORD p; TCHAR s[32]; HANDLE timer, hout; SYSTEMTIME t; LARGE_INTEGER due; hout = GetStdHandle(STD_OUTPUT_HANDLE); if(hout == INVALID_HANDLE_VALUE) return 0; inf = *(struct info*)arg; due.QuadPart = (LONGLONG)inf.delay * -10000LL; timer = CreateWaitableTimer(NULL, FALSE, NULL); if(timer == NULL) return 0; if(! SetWaitableTimer(timer, &due, inf.delay, NULL, NULL, TRUE)){ CloseHandle(timer); return 0; } while(! g_done){ if(WaitForSingleObject(timer, INFINITE) != WAIT_OBJECT_0) break; GetLocalTime(&t); l = (DWORD)wsprintf(s, TEXT("%02d:%02d:%02d"), t.wHour, t.wMinute, t.wSecond, t.wMilliseconds); p.X = inf.x; p.Y = inf.y; WriteConsoleOutputCharacter(hout, s, l, p, &n); FillConsoleOutputAttribute(hout, inf.color, l, p, &n); inf.color ^= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; } CancelWaitableTimer(timer); CloseHandle(timer); return 0; } int main(void){ struct info inf; char s[32]; DWORD id; HANDLE thd; inf.delay = 500L; inf.x = 36; inf.y = 1; inf.color = FOREGROUND_GREEN | FOREGROUND_INTENSITY; thd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_timer, (LPVOID)&inf, 0, &id); if(thd == NULL){ fprintf(stderr, "error: CreateThread, code: %lu\n", GetLastError()); return 1; } while(TRUE){ printf("enter cmd: "); scanf("%s", s); fflush(stdin); if(! strcmp(s, "exit")) break; } g_done = TRUE; WaitForSingleObject(thd, INFINITE); CloseHandle(thd); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д