Ученик-кочегар
Группа: Участник
Сообщений: 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 прогрессбара: первые два показывают подсчет потоков, а последний общую статистику.
А когда общий прогессбар заполнялся, вылетало окошко, что процесс завершен.
Поясните, какими функциями надо пользоваться? Я просто ни разу не делал визуализацию, и мне надо до среды успеть ее сделать.
Либо подскажите, где про эти функции и их применение можно почитать?
З.Ы. Все на чистом С! |