C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Визуализация метода Гаусса, помогите плиз!
Daredevil
Отправлено: 16.01.2006, 20:26


Ученик-кочегар

Группа: Участник
Сообщений: 22



У меня есть метод Гаусса для матрицы 100*100, который выполняется 2 потоками:

CODE

static void two_up(void)
{
int i=0,
 j=0,k,
 half = (SIZE/2);
double temp = 0.0;
// b[o]- handle, INFINITE — интервал тайм-аута функции не истекает
WaitForSingleObject(b[0], INFINITE);
//состояние события переходит в несигнальное
   ResetEvent(b[0]);
 for (i=0;i<half;i++)
{
 temp = matrix[i][j];

for (k=0;k<=SIZE;k++)
{
 if(matrix[i][k] == 0)
 {
  k++;
 }
 matrix[i][k]= matrix[i][k] / temp;
}
for (k=0;k<=SIZE;k++)
{
 if(matrix[i][k] == 0)
 {
  k++;
 }

 matrix[i][k] = matrix[i][k] * matrix[i+1][j];
}
 }
for(k=0;k<=SIZE;k++)
{
 if(matrix[i][k] == 0)
 {
  k++;
 }

 matrix[i+1][k] -= matrix[i][k];

}
j++;
// делает состояние события сигнальным, освобождая ждущие потоки
SetEvent(a[0]);

}


static void two_down(void)
{
int  i=0,
  j=0,k,
  half = (SIZE/2) + (SIZE % 2);
double temp = 0.0;

WaitForSingleObject(b[1], INFINITE);
   ResetEvent(b[1]);

 for (i=half;i<SIZE;i++)
{
 temp = matrix[i][j];

for (k=0;k<=SIZE;k++)
{
 if(matrix[i][k] == 0)
 {
  k++;
 }
 matrix[i][k]= matrix[i][k] / temp;
}
for (k=0;k<=SIZE;k++)
{
 if(matrix[i][k] == 0)
 {
  k++;
 }

 matrix[i][k] = matrix[i][k] * matrix[i+1][j];
}
 }
for(k=0;k<=SIZE;k++)
{
 if(matrix[i][k] == 0)
 {
  k++;
 }

 matrix[i+1][k] -= matrix[i][k];

}

j++;
SetEvent(a[1]);

}
void outtwo(DWORD t1, DWORD t2)
{
int i=0;
FILE *f = 0;
#ifdef FILE_OUT
f = fopen("out.txt", "a");
fprintf(f, "**********************************************\n");
fprintf(f, "Two Threads\n");
fprintf(f, "Result:\n");
for(i=0;i<SIZE;i++)
 fprintf(f, "%.lf ", copy[i][SIZE] / copy[i][i]);
fprintf(f,"\n");
fprintf(f, "\n Size: %ld   Time: %d\n", SIZE, t2 — t1);
fprintf(f, "**********************************************\n");
   fclose(f);
#endif

}

void twoThread(void)
{
DWORD       t1, t2;
   HANDLE      h[2];

t1 = GetTickCount();
//1 (NULL) — handle не может быть унаследован, 2 (TRUE) — создается событие с ручным сбросом
//3 (TRUE) — установлено сигнальное состояние, 4 (NULL) — безымянное событие
   a[0]  = CreateEvent(NULL, TRUE, FALSE, NULL);
   a[1]  = CreateEvent(NULL, TRUE, FALSE, NULL);
   b[0] = CreateEvent(NULL, TRUE, TRUE, NULL);
   b[1] = CreateEvent(NULL, TRUE, TRUE, NULL);


//1 (NULL) — handle не может быть унаследован, 2 — размер стека (для нового потока = 0)
//3 (__stdcall *)- стартовый адрес, 4 — лист аргументов, 5 (TRUE) — нач. состояние
//6 — адрес, указывающий на 32-битную переменную, получающую идентификатор  потока
h[0] = (HANDLE)_beginthreadex(NULL, 0, (unsigned int (__stdcall *)(void *))two_up, NULL, TRUE, NULL);
h[1] = (HANDLE)_beginthreadex(NULL, 0, (unsigned int (__stdcall *)(void *))two_down, NULL, TRUE, NULL);

t2 = GetTickCount();

//ставит состояние события в несигнальное
ResetEvent(a[0]);
ResetEvent(a[1]);
SetEvent(b[0]);
SetEvent(b[1]);

CloseHandle(a[0]);
   CloseHandle(a[1]);

   CloseHandle(b[0]);
   CloseHandle(b[1]);

outtwo(t1, t2);

}
void onethread(void)
{
DWORD t1, t2;
t1 = GetTickCount();
_beginthread( oneThread, 0, NULL );
t2 = GetTickCount();
out(t1,t2);
}

void main(void)
{
createM();
copyM();
twoThread();
copyM();

}


Мне надо создать его в каком-нибудь окошке, чтобы, когда я нажимал кнопку Start, progress-bar'ы заполнялись синеньким или квадратиками, пока считается матрица. Т.е. 3 прогрессбара: первые два показывают подсчет потоков, а последний общую статистику.
А когда общий прогессбар заполнялся, вылетало окошко, что процесс завершен.

Поясните, какими функциями надо пользоваться? Я просто ни разу не делал визуализацию, и мне надо до среды успеть ее сделать.
Либо подскажите, где про эти функции и их применение можно почитать?

З.Ы. Все на чистом С!

Вернуться в Вопросы программирования в C++Builder