Реально ли организовать выполнение 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы