Дано задание по многопоточным потокам в си. Есть разделяемая переменная F типа str, если нажата клавиша от 1 до 9, то происходит стирание символа в позиции N, а если нажата alt+(от 1 до 9), то Восстановление символа в позиции N.
Так же дан пример работы, но он дан для типа int :
Код:
// при нажатии "1" -> F=F+1 (операция 1)
// при нажатии "0" -> F=F-1 (операция 2)
#include <windows.h>
#include <conio.h>
#include <iostream.h>
#include <time.h>
HANDLE hThread; // дескриптор создаваемого потока
DWORD IDThread; // идентификатор потока
DWORD ThreadProc(struct log *p); // функция потока (параметр -
// указатель на структуру log)
int F=0; // разделяемая глобальная переменная
clock_t wtime=100; // время задержки (мс)
void waiting(clock_t dt); // функция задержки
// Журнал
struct log {
int nom; // порядковый номер операции
int key; // код нажатой клавиши
DWORD ID; // идентификатор созданного потока
clock_t t1; // время начала операции
clock_t t2; // время завершения операции
int F; // результат операции в дочернем потоке
int Fc; // результат операции главном потоке
// (переменная-дублер)
} mylog[1000]; // не более 1000 строк в журнале
//=================================================
int main() // главный поток
{
int i=0; // счетчик операций
int j=1; // счетчик вывода строк журнала
int key=1; // код нажатой клавиши
int flag=1; // признак завершения программы
int Fcontr; // переменная-дублер
mylog[1].t2=0; // признак того, что поток не завершен
Fcontr=F;
// повторять пока flag !=0 или i<1000
while (flag || i >=1000)
{
//Прием кода нажатой клавиши
if (kbhit()!= 0)
{
key= getch();
// формирование переменной-дублера
if (key == 48) Fcontr=--Fcontr;
else Fcontr=++Fcontr;
//Проверка кода нажатой клавиши
switch (key)
{
case 27 : {flag=0; break;} // признак выхода из
// программы (Esc)
case 48 : // нажата клавиша "0"
case 49 : // нажата клавиша "1"
{
i=++i; //следующая операция
// формируем строку журнала
mylog[i].nom=i;
mylog[i].key=key;
mylog[i].t2=0;
mylog[i].F=0;
mylog[i].Fc=Fcontr;
mylog[i].t1=clock();
// создание потока без немедленного запуска
hThread= CreateThread(NULL,0,ThreadProc,&mylog[i],CREATE_SUSPENDED,&IDThread);
if (hThread == NULL)
{ cout << "Thread error" << key << endl;
getch();
return 0;
}
else
{
// запуск потока
mylog[i].ID=IDThread;
ResumeThread(hThread);
}
}
}
}
// завершение работы потока проверяется по
// сформированному в функции
// потока значению времени t2
if (mylog [j].t2!=0)
{
// вывод j-й строки журнала
cout << j << " " << mylog[j].key << " " << mylog[j].ID << " " << mylog[j].t1 << " " << mylog[j].t2 << " " << mylog[j].F << " " << mylog[j].Fc <<endl;
j=++j; // следующая строка журнала
}
} // повторять пока flag !=0 или i<1000
getch();
return 0;
}
// функция потока: имитация "чтения", корректировки
// и "записи" разделяемой переменной F
// параметр - указатель на текущую строку журнала
DWORD ThreadProc(log *p)
{
int Fbuf;
// чтение разделяемой переменной в буферную переменную
Fbuf=F;
waiting(wtime); // задержка
// корректировка буферной переменной
if ((*p).key == 48) Fbuf=--Fbuf;
else Fbuf=++Fbuf;
waiting(wtime); // задержка
// запись из буферной переменной в разделяемую переменную
F=Fbuf;
// запись результата в текущую строку журнала
(*p).F=F;
(*p).t2=clock(); // время окончания работы потока
return 0;
}
// функция задержки
// параметр - время задержки в мс
void waiting(clock_t dt) {
clock_t tn;
tn=clock();
while (clock()-tn < dt);
return;
}
а вот как написать программу для моего задания?