нет синхронизации вывода печати с массивом

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
@ivan
Сообщения: 3
Зарегистрирован: 11 окт 2010, 11:56

Здравствуйте, помогите пожалуйста
задача такова: Один поток готовит матрицу в памяти M = 1000х1000 байт со случайными числами от 0 до 255. Другой поток в это время принимает с клавиатуры два числа X, Y, а третий поток – готовит на экране окно для вывода результатов расчетов. Как только данные с клавиатуры введены – из подготовленного массива выбирается байт с индексом (X,Y) и выводится на экран в окне третьего потока.
Задача решена, но есть недочет, сказали что нет синхронизации вывода печати с массивом. Помогите пожалуйста!

Код: Выделить всё

#include <windows.h>
#include <iostream.h>
#include <process.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
 
int mas[1000][1000],i,j,x,y;
 
bool zapolnilsa=false;
 
HANDLE ev1,ev2;
 
void thread1(void *)
{
srand((int)time(NULL)); 
    for(i=0;i<1000;i++)
                {
                        for(j=0;j<1000;j++)
                        {
                                mas[i][j]=rand()%256;
                        }
                }
        zapolnilsa=true;
}
 
void thread2(void *)
{
    cout<<"Enter x=";
        cin>>x;
        cout<<"Enter y=";
        cin>>y;
    SetEvent(ev1); 
 
}
void thread3(void *)
{
        while(zapolnilsa!=true)
        {}
 
        WaitForSingleObject(ev1, INFINITE); 
        cout<<"mas["<<x<<"]["<<y<<"]="<<mas[x][y]<<"\n";
        SetEvent(ev2); 
        CloseHandle(ev1); 
 
}
void main(void)
{
        ev1=CreateEvent(NULL, FALSE, FALSE, "event1"); 
        ev2=CreateEvent(NULL, FALSE, FALSE, "event2");
        _beginthread(thread1,0,NULL);
    _beginthread(thread2,0,NULL);
        _beginthread(thread3,0,NULL);
    WaitForSingleObject(ev2, INFINITE);
}
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

@ivan писал(а):

Код: Выделить всё

        while(zapolnilsa!=true)
        {}  

Сделайте еще одно событие на заполнение массива, а вместо этого кода сделайте ему wait. И не надо будет проверять миллион раз в секунду этот странный флаг.

P.S. А еще нужно освободить дескриптор ev2.
@ivan
Сообщения: 3
Зарегистрирован: 11 окт 2010, 11:56

А вы бы не могли набросать кусок кода, а то я в программировании новичек и что то не дорублю.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

А как же ты это накатал? Новичек :)
@ivan
Сообщения: 3
Зарегистрирован: 11 окт 2010, 11:56

Я взял уже готовую, но в ней недочет.
Ответить